@property (nonatomic, weak) id a;
@property (nonatomic, weak) id sa;
我有两个弱点。复制后,该阵列将被释放。
但是NSString不会被释放。我不知道有什么区别。为什么字符串不被释放?
{
NSMutableString *sa = [[NSMutableString alloc] initWithString:@"sa"];
NSMutableArray *array = [NSMutableArray arrayWithObject:@"aaa"];
self.a = [array copy];
self.sa = [sa copy];
NSLog(@"array:%p", array);
NSLog(@"self.a:%p", self.a);
NSLog(@"self.sa:%p", self.sa);
}
array:0x6000000479b0
self.a:0x0
self.sa:0xa000000000061732
最佳答案
发生的情况是您的字符串副本不是实际的对象,但是您得到了tagged pointer。基本上,整个字符串都存储在指针内部,根本没有分配。在没有分配的地方,没有内存可以释放,因此弱引用无法重置为nil
。
如果查看实际的指针0x617325
值并将其拆分为字节,则会找到整个字符串:
0x25 - Length (2) + flag (5) telling that it is a tagged string
0x73 - 's'
0x61 - 'a'
如果这是真实指针,则由于对齐要求,最后一位必须为零。这就是使那些带有标记的指针成为可能的全部魔力。
关于ios - 当弱对象= [NSMutableString副本]时,谁拥有[NSMutableString副本]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43568704/