我知道这已经被讨论过了,但我只是没有得到一些内存管理。我知道保留使对象保持活动状态,而副本则为对象提供了单独的副本。
我不明白的是,当涉及到 ivars 和属性时,将其保留为属性意味着 setter 释放旧值并保留新值:
property = newValue;
// retain
if (property != newValue)
{
[property release];
property = [newValue retain];
}
但我见过他们将静态字符串分配给保留属性 ivars 的示例,例如
self.stringProperty = @"something";
(some other code)
self.stringProperty = @"somethingElse";
设置字符串的第二次调用应该在不允许的静态字符串上调用释放,为什么程序不会崩溃?
另外,如果一个对象是用retain属性声明的,然后用init分配一些东西,例如
@property(retain)someArray;
someArray = [[NSArray alloc] initWithArray:arbArray];
这是否意味着 someArray 现在的保留计数为 2 但如果它是用
someArray = [NSArray arrayWithArray:arbArray];
保留计数只有 1,因为第二个是工厂方法?