可能重复:Objective-C中的弱和强属性setter属性
我是iphone开发的新手 . 任何人都可以告诉我什么时候使用强,什么时候使用弱参考,以及原子和非原子之间有什么区别 . 我经历了很多链接,但我仍然不清楚它 . 我还想知道ios5之前使用的保留,复制和分配之间的差异 .
任何帮助表示赞赏..
谢谢,拉吉
在设计数据时,您需要了解所有权的概念 . 数据拥有向下 . 所有权永远不会回溯到您的数据层次结构 . 如果A有一个指针指向B,而B指向C,那么C拥有A,你有一个循环参考图,由于A间接引用C而C引用A而导致内存泄漏A.发布A并且它没有得到删除,因为C仍然有一个引用,它不会被删除,除非A做 - 一个catch 22 .
为了避免这种情况,你使用强指针指向“向下”你的数据,并使用弱指针进行任何反向引用(例如父指针) .
如果属性是原子属性,它会生成一个允许从多个线程设置的setter . 您不能拥有一个线程同时更改另一个属性的竞争条件 . 非原子属性没有该线程锁定系统 .
最后,当您通过在对象上调用[myObject retain]将对象分配给它时,retain属性会增加对象的引用计数 . 复制调用[myObject copy]使属性不引用原始属性,但复制和赋值只是一个没有引用计数调整的直接赋值 .
1 回答
在设计数据时,您需要了解所有权的概念 . 数据拥有向下 . 所有权永远不会回溯到您的数据层次结构 . 如果A有一个指针指向B,而B指向C,那么C拥有A,你有一个循环参考图,由于A间接引用C而C引用A而导致内存泄漏A.发布A并且它没有得到删除,因为C仍然有一个引用,它不会被删除,除非A做 - 一个catch 22 .
为了避免这种情况,你使用强指针指向“向下”你的数据,并使用弱指针进行任何反向引用(例如父指针) .
如果属性是原子属性,它会生成一个允许从多个线程设置的setter . 您不能拥有一个线程同时更改另一个属性的竞争条件 . 非原子属性没有该线程锁定系统 .
最后,当您通过在对象上调用[myObject retain]将对象分配给它时,retain属性会增加对象的引用计数 . 复制调用[myObject copy]使属性不引用原始属性,但复制和赋值只是一个没有引用计数调整的直接赋值 .