iOS-strong和copy【详细解读】
strong和copy是常用到的修饰符,那么什么时候用strong,什么时候用copy,先上一段代码再说(以下代码直接在ViewController中写);
先定义两个数组
///strong @property (nonatomic,strong) NSArray *arraystrong; ///copy @property (nonatomic,copy) NSArray *arraycopy;
viewDidLoad方法
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *arrayMut = [NSMutableArray array]; ///先添加一个字符串 [arrayMut addObject:@"xiaogui1"]; self.arraystrong = arrayMut; self.arraycopy = arrayMut; ///再添加一个字符串 [arrayMut addObject:@"xiaogui2"]; ///内容 NSLog(@"arraystrong=%@\narraycopy%@\n",self.arraystrong,self.arraycopy); ///地址 NSLog(@"\n\n内存地址:\n\narrayMut 地址:%p\narraystrong 地址:%p\narraycopy 地址:%p\n",arrayMut,self.arraystrong,self.arraycopy); }
打印结果
再来看下三个数组指向的内存地址:
可以看到arraystrong随着arrayMut的改变而改变了,而arraycopy没有随着arrayMut的改变而改变;原因是因为用strong来修饰时,赋值时并没有创建新的空间,由打印的地址可以看到指向的是同一个指针的内存空间,而用copy时,创建了新的内存空间,没有和arrayMut指向同一个地址; 但是还有一个问题,往 ↓ 看:
当我把self改成下划线_去引用变量时:
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *arrayMut = [NSMutableArray array]; ///先添加一个字符串 [arrayMut addObject:@"xiaogui1"]; ///把self改成_ _arraystrong = arrayMut; _arraycopy = arrayMut; ///再添加一个字符串 [arrayMut addObject:@"xiaogui2"]; NSLog(@"arraystrong=%@\narraycopy%@",self.arraystrong,self.arraycopy); }
打印结果:
这是因为用self引用时,调用了自身的get set方法,也就是因为这样,才实现了strong和copy的不同,而直接用_是没有执行get set 方法的,所以两个数组的值是一样的;所以一般在项目中,全部使用self比较好,个人认为,有误还请指出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】