OBJC中retain和copy的区别详解

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

    @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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值