今天我看到用户首先释放对象的代码,然后他将该对象设为nil。像这样
[objectA release];
objectA=nil;
我已经在很多书中读到,我们应该在离开视图时使对象为零并稍后释放对象(当然,在dealloc方法中,此方法在viewWillDisappear或viewDidDisappear之后调用)。
现在我想知道哪种方法更好?
答案 0 :(得分:5)
设置为nil
并释放是两个不同的操作。
你release
放弃对它的所有权的对象。这包含在标准Memory Managemange Guidelines中。如果您不熟悉它们,则应在进行任何进一步的iOS编程之前阅读它们。
释放对象后,如果您知道某些其他代码稍后可能尝试访问该变量,则应将其设置为nil
。这在实例变量中最常见。
例如,您可以使用实例变量来存储某种缓存:
- (NSArray *)items
{
if (!cachedItems) {
cachedItems = [[self calculateItems] retain];
}
return cachedItems;
}
稍后您可能需要清除此缓存:
- (void)invalidateCache
{
[cachedItems release];
cachedItems = nil;
}
我们需要将cachedItems设置为nil,因为我们的items
方法可能会在以后尝试使用它。如果不将其设置为nil
,则发送到(现已发布)缓存的邮件可能会导致崩溃。
所以在释放它之后将变量设置为nil,以便稍后可以通过类中的其他方法访问它。
答案 1 :(得分:2)
我认为重要的设置对象不是nil,但是很好。
如果你这样做:
objectA = nil;
[objectA release];
你丢失了内存,这是内存泄漏。如果你只做[objectA release],你将释放内存,但objectA仍然指向内存,所以如果你尝试做以下事情:
if (objectA==nil)
这将返回FALSE,因为objectA不是零。但因为你几乎在
中这样做了 - (void)dealloc;
您不需要在此功能中将其设置为nil。
答案 2 :(得分:1)
如果在本地创建对象:
我会选择第一种方法,通常先释放对象然后分配一个nil。
我在任何一本书中都没有读到你的第二种方法。
如果对象是类变量的一部分且有retain
和@synthesize
:
以下内容将同时执行(首次发布然后通过 setter 功能分配nil
)。
self.object = nil ;
答案 3 :(得分:1)
第一种方法是找你的方式..
[objectA release];
objectA=nil;
同样使对象为零是一个很好的做法(如果你以后再使用它),因为在释放对象后,如果我不小心再次引用它,你的应用程序将崩溃。但是如果你给了nil这个对象,并且你稍后再引用它就不会在目标C中崩溃。(在类似java的语言中,情境类似于给出了nullpointerException)
即
[objectA doneSomeTask];
即使objectA为零,也不会崩溃。目标C默默地忽略了引用nil。
答案 4 :(得分:0)
你在书中读到的内容不起作用。如果将对象设置为nil,则以后无法释放它,因为您无法将对象多余。你应该采用第一种方法。
答案 5 :(得分:0)
最佳方式:
[objectA release]; // sightly sightly faster since less function calls
objectA=nil;
懒惰的方式:
self.objectA=nil;
它会打电话:
(void)setObjectA:(ObjectAClass *)objectA
{
[objectA release]; // <-- original value is released
objectA = [objectA retain];// <-- set the point to nil and do nothing since nil
}