retain assign copy (unsigned long)
unsigned long是无符号 计数器大于等于0;
assign: 简单赋值, 不更改索引计数。 基本数据类型 (主要是提供访问的,引用的变量不能给它赋值)
retain: (OC对象)对其他NSObject和其子类, retain是说明该属性在赋值的时候, 先release旧值, 然后retain新值, 引用计数器再加1。
copy: 指定应该使用对象的副本(深度复制), copy没有增加引用计数, 是分配一块新的内存来放置它, copy是创建一个新对象, retain是创建一个指针, 引用对象计数加1。 (主要是用于NSString的)
例如: NSString *str = [[NSString alloc] initWithString:@"aaa"];
执行两个动作:
1>在堆上分配一段内存用来存储@"aaa", 比如:内存地址为: 0x0012内容为"aaa";
2>在栈上分配一段内存用来存储str, 比如:地址为0xaaaa 内容为0x0012;
assign的情况:NSString *newStr = [str assign];
此时newStr和str完全相同地址都是0xaaaa, 内容为0x0012, 即newStr只是str的别名, 对任何一个操作就等于对另一个操作。因此计数器retaincount不需要增加1;
retain的情况:NSString *newStr = [str retain];
此时newStr地址不再是0xaaaa, 可能为0xbbbb, 但内容依然为0x0012, retain是创建一个指针, 即newStr只是str都可以管理"aaa"所在的内存。因此计数器retaincount需要增加1;
copy的情况:NSString *newStr = [str copy];
此时会在堆上重新开辟一段内存存放@"aaa" copy是创建一个新对象(newStr),比如0x0013内容为@"aaa", 同时会在栈上为newStr分配空间 比如地址0xcccc内容为0x0013。因此计数器retaincount增加1供newStr来管理0x0013这段内存;
readwrite: 产生setter\getter。
readonly: 只产生简单的getter,没有setter。
assign: 默认类型,setter方法直接赋值,而不进行retain操作。
retain: setter方法release旧值,再retain新值。
copy: setter方法release旧值,再copy新值。