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];  

此时newStrstr完全相同地址都是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增加1newStr来管理0x0013这段内存;

readwrite:  产生setter\getter。
readonly:   只产生简单的getter,没有setter。
assign:       默认类型,setter方法直接赋值,而不进行retain操作。
retain:       setter方法release旧值,再retain新值。
copy:         setter方法release旧值,再copy新值。

原文地址:https://www.cnblogs.com/wangshengl9263/p/3072166.html