@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
答案 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" - 也允许我说的话没有发生。