NSArray、NSDictionary、NSString 修饰符copy与strong的区别

探讨Objective-C中NSArray, NSDictionary, NSString等对象的内存管理。深入分析strong与copy修饰符的区别,特别是在使用可变数组时的影响。指出直接赋值的不当之处,并推荐初始化方法。

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

NSArray、NSDictionary、NSString同理

NSArray的修饰符使用strong时,如果用可变数组给其赋值,会出现可变数组改变时,array也会改变的情况
这显然是不希望出现的
但是使用copy将不会出现此问题

	NSMutableArray *mutableArray = [NSMutableArray array];
    [mutableArray addObject:@"1"];

    self.array = mutableArray;
    self.arrayCopy = mutableArray;
    DLog(@"!!! -- %@ ---%@",self.array,self.arrayCopy);

    [mutableArray addObject:@"2"];
    DLog(@"@@@ -- %@ ---%@",self.array,self.arrayCopy);

输出

[Line 64] array == (
    1
) arrayCopy == (
    1
)



[Line 67] array == (
    1,
    2
) arrayCopy == (
    1
)

查看下三个对象的内存地址

[Line 70] mutableArray -- 0x600000459c80 array ---0x600000459c80 arrayCopy ----0x60000001d310

strong修饰的对象 直接赋值后 指针指向了可变数组的内存地址 没有创建新的内存 所以2个指针指向同一个内存 当然输出是一致的
copy修饰的对象 直接赋值后 创建了一个新的对象、新的内存地址 对象内容当然不会被改变

但是,数组的创建为什么要直接赋值呢?这个习惯很不好!为什么不用字面量或者方法来初始化。
这个直接赋值的操作本身就是有问题的 我在开发中根本不会这样写 从形式来看 这个操作就是把一个新指针指向了一个老的内存 系统输出这个结果也是正确的 所以 我认为还是要在开发细节上多注意 不要做这么奇怪的操作

字典、数组直接赋值对象看似是很奇怪的,那么只要注意不这样写也就不会出现问题。
而字符串的copy毋庸置疑 是一定要用的 因为字符的相互赋值看似并不奇怪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值