OBJC中retain和copy的区别详解

来源:互联网 发布:红中癞子麻将胡牌算法 编辑:程序博客网 时间:2024/05/21 17:39

直接贴代码,注释很详细,一看就明白,可直接赋值代码到你的工程中进行测试,你会发现惊喜...

    @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来测试retaincopy的区别(否则你会被它搞得晕头转向的,因为你会发现用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


原创粉丝点击