在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];
}
谢谢!
答案 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]);
因此,我们在将保留计数赋值给某个对象之前增加了保留计数,然后 - 在此之后 - 我们发布本地该变量。
就是这样。