在返回之前释放局部变量?

时间:2010-02-17 20:12:29

标签: objective-c release local-variables

在objective-c中,我知道您需要释放您初始化/保留/复制的任何内容。在return声明之前我是否需要这样做?我想明白要明白调用release而不是autorelease

-(void) someMethod
{
  AnotherClass* ac = [[AnotherClass alloc] init];
  if([ac somethingHappens]){
    // Do I need to release ac here?
    return;
  }
  [ac doSomethingElse];
  [ac release];
}

谢谢!

2 个答案:

答案 0 :(得分:3)

是的,您需要释放变量,但是从方法中退出。

这很简单:当你初始化某些东西时,保留计数会增加。当你释放它时,它会减少。当它达到零时,它会自动解除分配(释放)。

在上面的代码中,您初始化变量但是如果它遵循返回路由,那么变量retain count永远不会变为零,因此永远不会被释放。

答案 1 :(得分:2)

假设有一个如下所示的局部变量

NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]];

现在将此变量传递给对象定义的方法,例如UISearchBar对象的setPlaceholder

[self.theSearchBar setPlaceholder:placeHolder];

如何以正确的方式释放指定的字符串'placeHolder'?

如果你想自动释放它:

NSString *placeHolder = [[NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]] autorelease];

您的代码将以bad_exc_access

失败

如果你想在传递到其他地方之后释放变量,比如

[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release];

运行时异常也会抛出。

那有什么不对?

问题是保留计数。 UISearchBar对象尚未分配,因此如果您释放或自动释放该对象引用的此类变量,则保留计数仍然相同

NSLog(@"Retain count before assign to refer other object %d", [placeHolder retainCount]);
[self.theSearchBar setPlaceholder:placeHolder];
NSLog(@"Retain count after referencing %d", [placeHolder retainCount]);

那么,如何处理呢?

尝试类似以下内容

[placeHolder retain]; // retainCount +1
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release]; // retainCount -1

我们做了什么?我们来看看现在的保留计数

NSLog(@"Retain count before doing retain %d", [placeHolder retainCount]);
[placeHolder retain]; // retainCount +1
NSLog(@"Retain count after retaining it %d", [placeHolder retainCount]);

因此,我们在将保留计数赋值给某个对象之前增加了保留计数,然后 - 在此之后 - 我们发布本地该变量。

就是这样。