zoukankan      html  css  js  c++  java
  • 什么时候用copy什么时候用retain (一)

       在声明一个property的时候总是搞不清什么时候用retain,什么时候用copy,用上去了感觉也不会错,但是又没有安全感;

       Copy:顾名思义,复制,将对象复制一份,ios内部的操作时,先copy出一份新的对象,然后销毁旧的,新的对象引用计数为1;

       retain:中文含义为保留,ios内部是,释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1;

        

    言下之意:Copy是内容复制;retain是内存地址复制;

    注意:

      例:
    @property (nonatomic, copy) NSMutableArray *listArray;
    

     当MutableArray被copy的时候,如果你实例化时的语句是:

        self.listArray = [[NSMutableArray alloc]init];

     然后去给它加对象:

        [self.listArray addObject: @"墨和米说"];
    

    这个时候运行则会报错,错误为:

    -[__NSArrayI addObject:]: unrecognized selector sent to instance 0xa7446f0

    按我的理解是@property 是系统内部生成setter和getter.当使用self.listArray = 的时候是利用setter给listArray赋值, 我又给这个setter方法设置了copy, 经过copy复制的listArray是一个不可变的数组(NSArray,详见官方文档), 然后我又去add,一个不可变数组显然add不进去,所以就报错了,当然这个报错就呵呵了.

    如果我们用:

    _listArray = [[NSMutableArray alloc]init];
    

     则不会报错!

    因为_listArray是一个变量,是在栈内存里, copy了还是指向的还是原来的可变数组,所以add显然就不会出问题!

    可参考:http://blog.csdn.net/mars2639/article/details/7352540

    下一期将会用一段代码来演示 

  • 相关阅读:
    项目包结构
    准备dbcp2-2.1.1和pool2-2.4.2 、commons-dbcp-1.4jar包
    导入javax.servlet。伺服登记无法解决:The import javax.servlet.MultipartConfigElement cannot be resolved
    准备mysql-connector-java
    准备mybatis-spring
    准备spring
    准备MyBatis
    vim编辑器使用
    jquery怎样做出分页效果
    快速入门系列--WCF--02消息、会话与服务寄宿
  • 原文地址:https://www.cnblogs.com/mohe/p/3451899.html
Copyright © 2011-2022 走看看