2012-09-15 50 views
1

可能重复会发生什么:
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。我读到所有局部变量默认强壮,强壮与保留相似。因此,在上述情况下,我的假设是myobj被保留,并在方法watchStrongVariable中拥有,但是由于myobj被保留,没有释放消息发送到本地变量。有人可以向我解释为什么在上述情况下不需要发布myobj

回答

2

当您使用ARC时,您无法使用保留,发布或autorelease,因为ARC会为您照顾。你可以简单地这样做:

- (MyClass *)getMyclassObject { 
    return [[MyClass alloc] init]; 
} 

编译器会为你添加autorelease调用。但是ARC的整个观点不再需要考虑很多。

2

使用ARC时,您不需要使用autorelease任何东西。实际上,这会产生编译器错误。

因此,在使用ARC时,这将是正确的:

-(MyClass *) getMyclassObject{ 
    return [[MyClass alloc] init]; 
} 
+2

“实际上,这会产生一个编译器警告。”相反,一个错误 - 警告不是致命的,但这是一个错误。 +1虽然。 – 2012-09-15 19:40:24

+1

感谢H2CO3,你是对的。我修改了我的答案。 – gilletty

2

一,你不能用明确的retainrelease也不autorelease当在ARC - 编译器不会允许它。

二,在这种情况下,你不必考虑这个问题,因为它很简单 - 当一个强变量超出范围时,它相当于一条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作为获取方名称 - 这是为具有输出标记的方法(即接受要写入的指针)保留的方法,如UIColor的getRed:green:blue:alpha:方法。 二,对于函数,开放大括号分开一行,并且星号表示指针类型应该与变量名称而不是类型冲突。所以最好是写int *i;而不是int* i;或​​3210。

+0

感谢您的答复。我会考虑所有的建议。如果在上述情况下,我没有使用ARC,那么影响和myobj上发布是必要的,为什么。 – user1673825