※ 引述《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