1.self.name = [[NSString alloc] init];
2._name = [[NSString alloc] init];
self.name = @"whatif";
上面的两种方式:我们多数人认为1和2中_name的应用计数都是2,因为对于1:用了"self.name="(set方法),alloc了,引用计数为2;对于2:用了alloc,又用了"self.name="(set方法),引用计数为2.
其实上面的说法是错误的!!!
正确的答案是:1中_name的引用计数为2,2中_name的引用计数为1。
原因是set方法的内部实现:
- (void)setName:(NSString *)name{
if(_name != name){
[_name release];
[_name = name retain];
}}
对于第1种情况:先用了"self.name=",由于_name没有初始化,为nil,调用set方法的时候,[_name release],不起作用,没有减1,但是[name retain]了,_name引用计数加了1次;然后又用了alloc,_name的引用计数变为2。
对于第2种情况:先用了alloc,_name引用计数变为1;由于_name 不为nil,调用set方法的时候,[_name release],引用计数减1,此时,_name的引用计数为0;[name retain]了一次的时候,引用计数为1。
致力于ios开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架