@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/

    10-13 21:37