assign,copy,strong,weak,nonatomic的具体理解

    NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅'];  安全

上面一段代码会执行如下两个动做:  
1 在堆上分配一段内存用来存储@' MM的三室两厅 ' ,好比:内存地址为 0X1111  内容为 ' MM的三室两厅' ,  
2 在栈上分配一段内存用来存储 houseForWife ,好比:地址为 0XAAAA  内容天然为 0X1111    

下面分别看下(assign,retain,copy):  
1.assign的状况: NSString  * myHouse  = [ houseOfMM   assign ];  
此时 myHouse 和 houseOfMM 彻底相同,地址都是 0XAAAA  ,内容为 0X1111  ,即 myHouse 只是 houseOfMM 的别名,对任何一个操做就等于对另外一个操做。所以 retainCount 不须要增长.(同进同出,关系好,一把钥匙,给我拿着)  
2.retain的状况: NSString  *  myHouse  = [ houseOfMM   retain ];  
此时 myHouse 的地址再也不为 0XAAAA ,可能为 0XAABB ,可是内容依然为 0X1111 .所以 myHouse 和 houseOfMM均可以管理' 装梵几的三室两厅 '所在的内存。所以  retainCount 须要增长1.(有些独立,各自进出,两把钥匙)  
3.copy的状况: NSString  *  myHouse  = [ houseOfMM   copy ];  多线程

此时会在堆上从新开辟一段内存存放@'MM的三室两厅',好比0X1122,内容为@'MM的三室两厅',同时会在栈上为myHouse分配空间,好比地址:0XAACC,内容为0X1122,所以retainCount增长1供myHouse来管理0X1122这段内存.(两套@'装梵几的三室两厅',条件好,分居了,房子一人一套,因此钥匙一人一把。) post


何时用assign,固然是破房子,简装的房子拉
基础类型(简单类型,原子类型):NSInteger,CGPoint,CGFloat,C数据类型(int,float,double,char等)

何时用copy
含有可深拷贝的mutable子类的类,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
(可深度拷贝的房子)
可是NSMutableArray这样的不能够,Mutable的不能用copy,否则初始化会有问题。切记

何时用retain
其余NSObject和其子类对象好嘛 (大多数)

ARC中的strong至关于非ARC中的retain,ARC来了之后多搞一把钥匙就strong了啦。 atom

以上内容参考原地址为:点这里线程

weak:由ARC引入的对象变量的属性,比assign多了一个功能,对象消失后把指针置为nil,避免了野指针(不是null指针,是指向“垃圾”内存(不可用的内存)的指针)指针

nonatomic 
指出访问器不是原子操做,而默认地,访问器是原子操做。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器获得的返回值或者经过设置器设置的值能够一次完成,即使是别的线程也正在对其进行访问。若是你不指定nonatomic,在本身管理内存的环境中,解析的访问器保留并自动释放返回的值,若是指定了nonatomic,那么访问器只是简单地返回这个值。htm

相关文章
相关标签/搜索