当一个弱对象= [NSMutableString copy]时,谁持有[NSMutableString copy]?

时间:2017-04-23 07:55:28

标签: ios objective-c

@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
    

2 个答案:

答案 0 :(得分:8)

您的字符串副本不是实际对象,但会得到tagged pointer。基本上整个字符串存储在指针内部,根本没有分配。并且在没有分配的情况下,没有内存被释放,因此弱引用无法重置为nil

如果查看实际指针0x617325的值并将其拆分为字节,则可以找到整个字符串:

0x25 - Length (2) + flag (5) telling that it is a tagged string
0x73 - 's' 
0x61 - 'a'

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

答案 1 :(得分:0)

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

第二,"复制"不需要制作实际的副本,它需要表现为,好像是一个副本。由于可变字符串sa无法变异,因此允许[sa copy]返回sa,并且sa = self.sa仅在离开方法后释放。

"但是self.a是nil" - 也允许我说的话没有发生。