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

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

  • 相关阅读:
    纯真IP数据库格式详解
    iframe框架详解
    搜刮的网址
    Drupal设置首页默认内容
    PHP开发之路之一WAMP的安装和配置
    PHP中json序列化后中文的编码显示问题
    Mysql转化blob为可读
    使用Xtrabackup来备份你的mysql
    MySQL压力测试工具mysqlslap的使用
    Cacti 监控 MySQL
  • 原文地址:https://www.cnblogs.com/mohe/p/3451899.html
Copyright © 2011-2022 走看看