首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当弱对象= [NSMutableString副本]时,谁持有[NSMutableString副本]?

当弱对象= [NSMutableString副本]时,谁持有[NSMutableString副本]?
EN

Stack Overflow用户
提问于 2017-04-23 07:55:27
回答 2查看 158关注 0票数 9
代码语言:javascript
复制
@property (nonatomic, weak) id a;
@property (nonatomic, weak) id sa;

我有两个弱属性。该数组将在复制后释放。但是NSString没有被释放。我不知道有什么区别。为什么不释放字符串?

  • 查看代码和输出: { NSMutableString *sa = [NSMutableString alloc initWithString:@" sa "];NSMutableArray *array = NSMutableArray arrayWithObject:@"aaa";self.a .a=数组复制;self.sa =sa copy;NSLog(@" array :%p",数组);NSLog(@"self.a:%p",Sel.a);NSLog(@"self.sa:%p",self.sa);}数组:0x6000000479b0 self.a:0x0 self.sa:0xa000000000061732
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-23 09:05:03

所发生的情况是,您的字符串副本不是一个实际的对象,但是您得到了一个标记指针。基本上,整个字符串都存储在指针中,根本没有分配。在没有分配的地方,就没有要释放的内存,因此弱引用不能重置为nil

如果查看实际指针0x617325值并将其拆分为字节,就会发现整个字符串:

代码语言:javascript
复制
0x25 - Length (2) + flag (5) telling that it is a tagged string
0x73 - 's' 
0x61 - 'a'

如果这是一个真正的指针,由于对齐要求,最后一个数字必须是零。这就是让这些有标记的指针成为可能的全部魔力。

票数 8
EN

Stack Overflow用户

发布于 2017-04-23 09:03:49

首先,你的问题不是关于任何有用的东西,而是关于编译器的琐事。

第二,“复制”不需要复制实际的副本,而是要求它表现得好像复制了一个副本一样。由于无法更改可变字符串sa,因此允许sa复制只返回sa,而sa = self.sa只在离开该方法后才释放。

“但是自我是零”--我所说的也是不可能发生的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43568704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档