作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] strong weak
时间Mon Jul 28 12:39:45 2014
※ 引述《fightword (呼啦啦~)》之铭言:
: 想请教一下比较基本的问题
: @property(strong, nonatomic)NSString* value1;
: @property(weak, nonatomic)NSString* value2;
: @property NSString* value3;
: 请问一下这3种宣告的value1, value2, value3
: 在ARC中有没有比较口语话的解译方式
: 试着去看了一下文件,真觉得完全看不懂
: 先谢谢了
括弧里面是 property 属性设定, 可以用来覆写预设的属性
整个括弧省略(第三个)代表完全使用预设值
本例的 property type 是 Objective-C object
所以这代表 strong, atomic, readwrite
C scalar(例如 int, struct 等)的预设是 assign, atomic, readwrite
可用的属性包括:(来源
http://d.pr/JaAK)
01. atomic //default
02. nonatomic
03. strong=retain //default
04. weak=unsafe_unretained
05. retain
06. assign //default
07. unsafe_unretained
08. copy
09. readonly
10. readwrite //default
(第四个应该不对, 後面讨论)
其中 atomic 与 nonatomic 是一组, readonly 与 readwrite 是一组
前面两个代表该 property 的 setter/getter 是否为 thread-safe
一般而言如果你没用到 threads(含 GCD 等等)用 nonatomic 会节省一些资源
不过差别没那麽大, 尤其在 OS X
後两者就是存取权限设定, 应该看字面就知道意思了
接下来就是困难的部分
如果你还不知道 Objective-C 的记忆体管理模式, 请先自行了解
这随便找个网友推荐的英文书应该都讲得不错
如果真的不想买, 官方文件在这里(文长注意)
http://d.pr/7C0E
好, 假设你已经看完了, 那麽你现在应该懂得基本的 MRR
在使用 ARC 的状态下, 你不需要自己进行记忆体管理
但是你需要稍微提示编译器, 它才能帮你插入合适的记忆体管理机制
从简单的开始
C 纯量不需要记忆体管理, 直接用 = 就好
这种管理方式就是 assign
如果是 pointer, 那麽就可能需要记忆体管理
但也或许不用(或不能)—或许因为对象是 C struct 或 C++ class 或其他原因
那麽这时候你就要明确指示编译器你不想要它帮你管理这个物件
要使用的就是 unsafe_unretained
这会让你的 setter 成为单纯的 pointer assignment
所以其实本质上和 assign 一样(不是 weak!)
接着就是 strong 和 weak
如果你看完上面很长的官方文件, 那麽应该能了解他们的主要差异
就是一个会 retain 对象, 一个不会
而 weak 与 assign/unsafe_unretained 属性之间的差异则是
当前者被 release 时, property 值会自动被 nil-out
用下面的状况为例
MayoralCandidate ---------> Fruit
orange
市长候选人实例拥有一个叫 orange 的 property, 指向一个 Fruit 实例
如果 orange 是 weak, 那麽当水果被 dealloc 时, orange 属性会自动变成 nil
但如果它是 assign(或 unsafe_unretained)
那麽水果实例的状态就完全不会影响到市长候选人
这代表市长候选人必须自己判断 orange 属性指向的对象是否有效
另一方面当然 strong 就代表会 retain 对象
当然就不会有上面这些问题, 只会(讲得超轻描淡写XD)造成 retain cycles 而已
最後一个, copy 代表把 setter 获得的东西 copy 一份来用
被 retain 的是该拷贝, 而不是你原本传入的物件本身
这通常用在 NSString 或 NSNumber 之类的状况
你希望设定之後就设定了, 不要因为原本的物件被改变而造成自己改变
例如视窗的标题之类
另外要注意 copy 属性通常只应该被用在符合 NSCopying protocol 的类别
大概就这样, 我有点觉得讲了等於没讲, 你还是得啃文件
找一本好书来看吧, 会事倍功半的
--
「我最想要的同伴嘛,首先是要笑口常开,其次是我们能永远不会发生误会。
如果这些都能办到的话,嗯,如果他是世界上第一流的桥手,也还不错。」
-- 班尼多‧加罗素,前义大利蓝队成员
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.94.57
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/MacDev/M.1406522389.A.5B6.html
1F:推 howdiun:浅显易懂推 07/28 12:50
Edit: 因为蓝宝坚尼被 dealloc 太哀伤了, 换个例子
※ 编辑: uranusjr (140.112.94.57), 07/28/2014 13:00:33
2F:推 kyushu:good~ 07/28 13:24
3F:推 fightword:很棒了 我会再看一下 3Q 07/28 13:52
4F:推 Jerrynet:会事倍功半的!!!??? 07/28 16:31
5F:→ uranusjr:写错XDDD 请自行脑内修正 07/28 17:51