我知道这已经被讨论得令人作呕,但我只是不明白一些内存管理。据我所知,retain 使对象保持事件状态,而 copy 则提供对象的单独副本。
我不明白的是,当涉及到 ivars 和属性时,保留作为属性意味着 setter 释放旧值并保留新值:
property = newValue;
// retain
if (property != newValue)
{
[property release];
property = [newValue retain];
}
但我见过他们将静态字符串分配给保留属性 ivars 的示例,例如
self.stringProperty = @"something";
(some other code)
self.stringProperty = @"somethingElse";
第二次调用set string应该对静态字符串调用release,这是不允许的,为什么程序不会崩溃?
此外,如果一个对象是用retain属性声明的,然后用init分配一些东西,例如
@property(retain)someArray;
someArray = [[NSArray alloc] initWithArray:arbArray];
这是否意味着 someArray 现在的保留计数为 2,但如果它是使用创建的
someArray = [NSArray arrayWithArray:arbArray];
保留计数只有 1,因为第二个是工厂方法?
最佳答案
The second call to set string should call release on the static string which is not allowed, why doesn't the program crash?
您可以将 release
传递给常量字符串,它只是不会做任何有意义的事情,因此这些代码行是有效的。
does that mean someArray now has a retain count of 2 but if it was created with...the retain count is only 1 because the 2nd is a factory method?
首先,
someArray = [[NSArray alloc] initWithArray:arbArray];
不使用@property
创建的方法,它只是直接访问ivar。要使用属性方法,您必须使用 self.someArray = ...;
。
但是,是的,
[[NSArray alloc] initWithArray:arbArray]
返回一个有效保留计数为 1 的对象,并且
[NSArray arrayWithArray:arbArray]
返回一个有效保留计数为 0 的对象,因此,如果您确实将它们传递给 @property
创建的“retain”setter,则 ivar 将有一个有效保留数分别为 2 和 1。
关于objective-c - Objective C 内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213244/