• 什么时候用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

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

  • 相关阅读:
    英式音标
    音标
    JavaWeb中文件的上传和下载
    SpringMVC简单实例(看起来有用)
    C语言指针的初始化和赋值
    VC++ CopyFile函数使用方法
    未将对象引用设置到对象的实例--可能出现的问题总结
    strip 命令的使用方法
    css3 animation动画事件
    CSS中的几个概念--------Day39
  • 原文地址:https://www.cnblogs.com/mohe/p/3451899.html
Copyright © 2020-2023  润新知