strong和copy

本文探讨了Objective-C中strong和copy属性修饰符的区别。通过实例对比,详细解析了这两种修饰符在处理不可变和可变对象时的行为差异,以及它们如何影响内存管理。

以下对使用strong 和 copy的地方都适用

.h

    @interface Test : NSArray

    @property (nonatomic,strong) NSArray * sArray;
    @property (nonatomic,copy) NSArray * cArray;

    - (void) pri;

    @end

.m

    @implementation Test

    - (void) pri
    {
        NSArray *array = @[@"one",@"two",@"three"];

        self.cArray = array;       //self(本对象)调用点方法(setter) ,属性为copy
        self.sArray = array;       //self(本对象)调用点方法(setter) ,属性为strong

        NSLog(@"%p , %p",array,&array);
        NSLog(@"%p , %p",_sArray,&_sArray);
        NSLog(@"%p , %p",_cArray,&_cArray);

        /* 输出为
        2018-01-25 19:50:39.637630+0800 2[3833:246728] 0x6080002516a0 , 0x7ffee087b0e0
        2018-01-25 19:50:39.638249+0800 2[3833:246728] 0x6080002516a0 , 0x608000035068
        2018-01-25 19:50:39.638418+0800 2[3833:246728] 0x6080002516a0 , 0x608000035070
        */
    }

    @end
NSArray *array = @[@"one",@"two",@"three"];

    换成 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"one",@"two", nil];    
    //因为NSMutableArray只有这种初始化方式,而没有字面量初始化方式

    /* 输出为
    2018-01-25 19:57:03.144418+0800 2[3900:250713] 0x604000057ee0 , 0x7ffeead42108
    2018-01-25 19:57:03.145072+0800 2[3900:250713] 0x604000057ee0 , 0x604000023ea8
    2018-01-25 19:57:03.145334+0800 2[3900:250713] 0x604000023ec0 , 0x604000023eb0
    */

结论:

  • strong 和 copy修饰的属性对于不可变的源对象是浅拷贝,即将指针都指向了源对象地址
  • strong 修饰可变源对象是浅拷贝,copy修饰可变源对象时候是深拷贝
  • 在源对象为可变时候,因为copy会进行深拷贝,所以开销会较strong大
  • 注意浅拷贝修改带来的修改,为避免不可预知的现象发生,建议使用copy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值