5

在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];
}

谢谢!

4

2 回答 2

3

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

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

在上面的代码中,您初始化了变量,但如果它遵循返回路径,则变量保留计数永远不会为零,因此永远不会被释放。

于 2010-02-17T20:18:36.260 回答
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]);

因此,我们在将其分配(被引用)给某个对象之前增加了保留计数,并且 - 之后 - 我们在本地释放该变量。

就这样。

于 2011-07-22T11:32:37.520 回答