直接贴代码,注释很详细,一看就明白,可直接赋值代码到你的工程中进行测试,你会发现惊喜...
@property (copy,nonatomic) A *a;
@property (copy,nonatomic) A *a2;
A *temp = [[A alloc]init];
//在这里打印,retainCount为1
NSLog(@"count 1:%d",[tempretainCount]);
self.a = temp;
self.a2 = temp;
//这里打印,因为copy是会retain,但retain的不是原来的对象,而是一个新对象,所以以下三个打印都是1,如果把声明换成retain,那么结果都是3,经测试完全符合预期结果,另外说明:不要用NSString来测试retain和copy的区别(否则你会被它搞得晕头转向的,因为你会发现用NSString来测试,无论你用copy还是retain声明变量,得到的retainCount结果都是一样的,找不出区别,可能因为NSString的内部实现可能有些特殊…,特殊之处有待研究…)
NSLog(@"count temp:%d",[tempretainCount]);
NSLog(@"count a:%d",[self.aretainCount]);
NSLog(@"count a2:%d",[self.a2retainCount]);
另外附上A类的声明和实现,注意必须实现NSCoping协议,否则A类型的变量不能被声明为copy
@interface A : NSObject<NSCopying>
@end
@implementation A
-(id)copyWithZone:(NSZone *)zone
{
return [[[self class] alloc]init];
}
@end