何时使对象为零以及何时调用释放

时间:2011-06-01 11:46:59

标签: ios objective-c cocoa-touch memory-management

今天我看到用户首先释放对象的代码,然后他将该对象设为nil。像这样

[objectA release];
objectA=nil;

我已经在很多书中读到,我们应该在离开视图时使对象为零并稍后释放对象(当然,在dealloc方法中,此方法在viewWillDisappear或viewDidDisappear之后调用)。

现在我想知道哪种方法更好?

6 个答案:

答案 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
}