一. copy 和 retain 区别

copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString

对NSString 它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

对其他NSObject和其子类
对参数进行release旧值,再retain新值
指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。
注意: 把对象添加到数组中时,引用计数将增加对象的引用次数+1。

Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×110,内容为@"HK"
Copy到另外一个NSString之后,地址为0×220,内容相同,新的对象retain值为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝。

retain的set方法应该是浅复制,copy的set方法应该是深复制了

copy另一个用法:

copy是内容的拷贝 ,对于像NSString,的确是这样.
但是,如果是copy的是一个NSArray呢?比如, 
NSArray *array = [NSArray arrayWithObjects:@"hello",@"world",@"baby"];
NSArray *array2 = [array copy]; 
这个时候,,系统的确是为array2开辟了一块内存空间,但是我们要认识到的是,array2中的每个元素,,只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".

assign: 简单赋值,不更改索引计数

二.  strong和weak

strong 用来修饰强引用的属性;

@property (strong) SomeClass * aObject;

对应原来的

@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject;
weak 用来修饰弱引用的属性;
@property (weak) SomeClass * aObject;
对应原来的

@property (assign) SomeClass * aObject;

ARC 的规则非常简单只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、局部变量都是适用的。

关于strong和weak具体解释在后边的转载内容中......