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

Iqb*_*han 1 cocoa-touch memory-management objective-c ios

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

[objectA release];
objectA=nil;
Run Code Online (Sandbox Code Playgroud)

我在很多书中读过,我们应该在保留视图的同时使对象为零并稍后释放对象(当然,在dealloc方法中,此方法在viewWillDisappear或viewDidDisappear之后调用).

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

Mik*_*ler 5

设置nil和释放是两个不同的操作.

release是一个放弃它的所有权的对象.标准内存管理指南中对此进行了介绍.如果您不熟悉它们,则应在进行任何进一步的iOS编程之前阅读它们.

释放对象后,nil如果您知道某些其他代码稍后可能尝试访问该变量,则应将其设置为.这在实例变量中最常见.

例如,您可以使用实例变量来存储某种缓存:

- (NSArray *)items
{
    if (!cachedItems) {
        cachedItems = [[self calculateItems] retain];
    }

    return cachedItems;
}
Run Code Online (Sandbox Code Playgroud)

稍后您可能需要清除此缓存:

- (void)invalidateCache
{
    [cachedItems release];
    cachedItems = nil;
}
Run Code Online (Sandbox Code Playgroud)

我们需要将cachedItems设置为nil,因为我们的items方法可能会在以后尝试使用它.如果我们将其设置为nil,则发送到(现在已发布)缓存的消息可能会导致崩溃.

所以在释放它之后将变量设置为nil,以便稍后可以通过类中的其他方法访问它.