举个例子:html
NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; ios
上面一段代码会执行如下两个动做:
1 在堆上分配一段内存用来存储@' 装梵几的三室两厅 ' ,好比:内存地址为 0X1111 内容为 ' 装梵几的三室两厅' ,
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 ]; app
此时会在堆上从新开辟一段内存存放@'装梵几的三室两厅',好比0X1122,内容为@'装梵几的三室两厅',同时会在栈上为myHouse分配空间,好比地址:0XAACC,内容为0X1122,所以retainCount增长1供myHouse来管理0X1122这段内存.(两套@'装梵几的三室两厅',条件好,分居了,房子一人一套,因此钥匙一人一把。) .net
何时用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了啦。 翻译
抄袭:http://wenku.baidu.com/view/ab6ed804bed5b9f3f90f1c7d.html 指针
有空的话翻译一下好嘛: orm
http://clang.llvm.org/docs/AutomaticReferenceCounting.html htm
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html 对象
http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html blog
先看这个 :
http://blog.csdn.net/favormm/article/details/7023322
http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/
http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/
来源:http://my.oschina.net/openlab/blog/89354
• copy: 用于但愿保持一份传入值的拷贝,而不是值自身的状况,即把原来的对象完整的赋值到另一地方,从新加载一内存区,一个地方变了不影响另外一个地方的对象。
• assign: 简单的直接赋值,至关于说两个对象指向同个内存区,一个地方的变了,其余的也跟着改变。
• retain:释放旧的对象,将旧对象的值赋予输入对象,再提升输入对象的索引计数 为1
那上面的是什么意思呢?
Copy 实际上是创建了一个相同的对象,而 retain 不是:
好比一个 NSString 对象,地址为 0×1111,内容为@”ABC”
Copy 到另一个 NSString 之 后,地址为 0×2222,内容相同,新的对象 retain 为 1, 旧 有对象没有变化
retain 到另一个 NSString 之 后,地址相同(创建一个指针,指针拷贝),内容固然相 同,这个对象的 retain 值+1
assign 地址仍是0x1111,内容也仍是“ABC”。
也就是说,retain 是指针拷贝,copy 是内容拷贝。
strong,weak 用来修饰属性。
strong 用来修饰强引用的属性;
@property (strong) SomeClass * aObject;
对应原来的
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; weak 用来修饰弱引用的属性;@property (weak) SomeClass * aObject; 对应原来的 @property (assign) SomeClass * aObject;