可能重复:
Is AutoRelease redundant when using ARC in Objective-C?
我是目标C的新手,并了解其内存管理。我真的很难理解强变量的行为。下面是片段,真的让我感到困惑。我有以下方法,我正在使用ARC。
-(void) watchStrongVariable {
MyClass * myobj = [self getMyClassObject];
// ...
}
-(MyClass *) getMyclassObject{
return [[[MyClass alloc] init] autorelease];
}
在第2行中,我将MyClass
个对象分配给局部变量myobj
。我读到默认情况下所有局部变量都是强大的,而strong类似于retain。因此,在上述情况下,我的假设myobj
被保留,并且在方法watchStrongVariable
中拥有,但是如果我们不通过调用显式释放myobj
,则保留myobj
的问题[myobj release]
。我看到许多程序遵循相同的模式,但没有发送到本地变量的释放消息。有人可以解释为什么在上述情况下不需要释放myobj
。
答案 0 :(得分:2)
当您使用ARC时,不能使用保留,释放或自动释放,因为ARC会为您处理。你可以这样做:
- (MyClass *)getMyclassObject {
return [[MyClass alloc] init];
}
编译器会为您添加自动释放调用。但ARC的重点在于不再需要考虑这个问题了。
答案 1 :(得分:2)
使用ARC时,您不需要自动释放。实际上,这会产生编译器错误。
使用ARC时这是正确的:
-(MyClass *) getMyclassObject{
return [[MyClass alloc] init];
}
答案 2 :(得分:2)
其一,在ARC下,您不能使用显式retain
,release
或autorelease
- 编译器不会允许它。
二,在这种情况下你根本不需要考虑这个问题,因为它很简单 - 当一个强变量超出范围时,它等同于release
消息。那么这一切在ARC下的运作方式是:
- (void)watchStrongVariable
{
MyClass *myobj = [self myClassObject]; // implicit retain-on-assignment
// implicit release-on-end-of-scope
}
- (MyClass *)myClassObject
{
return [[MyClass alloc] init]]; // implicit release-after-return
}
关于编码风格的一些建议。一,不要将getXXXX
用于getter名称 - 这是为具有输出artuments的方法保留的(即接受要写入的指针),如UIColor的getRed:green:blue:alpha:
方法。
二,对于函数,左大括号在一条单独的行上,指示指针类型的星号应与变量名而不是类型相冲突。所以最好是写int *i;
而不是int* i;
也不是int * i;
。