iOS copy和retain、strong的区别

本文探讨了Objective-C中strong属性与copy属性的区别。通过一个NSMutableString实例的演示,展示了不同属性声明方式下变量的变化情况,揭示了retain与copy属性在处理可变字符串时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把一个对象赋值给一个属性变量,当这个对象变化了,如果希望属性变量变化就使用strong属性,如果希望属性变量不跟着变化,就是用copy属性。
例:

@interface ViewController ()
@property (nonatomic,retain) NSString *rStr;
@property (nonatomic,copy)   NSString *cStr;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableString *mStr = [NSMutableString stringWithFormat:@"abc"];
    self.rStr = mStr;
    self.cStr = mStr;
    NSLog(@"mStr is %@ %p",mStr,&mStr);
    NSLog(@"_rStr is %@ %p",_rStr,&_rStr);
    NSLog(@"_cStr is %@ %p",_cStr,&_cStr);
    [mStr appendString:@"de"];
    NSLog(@"mStr is %@",mStr);
    NSLog(@"_rStr is %@",_rStr);
    NSLog(@"_cStr is %@",_cStr);
}
@end

由此可以看出:

对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。

对源头是NSString的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。

另外说明一下,这两者对内存计数的影响都是一样的,都会增加内存引用计数,都需要在最后的时候做处理。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值