3

我知道我想使用:INIT]在自动引用计数

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
realObject = tmpObject; 
[tmpObject release] 

初始化realObject(其中realObject是一个类中的对象)

但是现在与ARC模式,释放是自动,我仍然需要使用这种技术? 我可以简单地使用realObject = [[ObjectClass alloc] init];吗? 如果不是,有什么具体原因会泄漏?

感谢

回答

16

正如Spencer所说,如果您在启用ARC的情况下编译,您根本不能调用release。这样做是错误的,编译器会为您处理它。

然而:

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
realObject = tmpObject; 
[tmpObject release] 

在这种情况下的tmpObject对于两个ARC和手动保持释放完全没有意义的。事实上,在手动保留释放中,上面的代码将立即释放分配的对象,导致它被释放(除非ObjectClass内部做一些奇怪的事情),而realObject将留下一个悬挂指针。

I.e.正如所写的那样,如果任何人第一次尝试向消息realObject发送消息,将会导致崩溃。

澄清:

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
// tmpObject now contains a reference to an instance of ObjectClass; say, 0x12340 
realObject = tmpObject; 
// realObject now contains a reference to that same instance; realObject == 0x12340 
[tmpObject release] 
// this releases the object 
// both tmpObject and realObject now reference a deallocated object; much hilarity ensues.  

对于ARC,你只是这样做:

realObject = [[ObjectClass alloc] init]; 
+0

谢谢,这是一个明确的解释:D。 –

+0

我不明白为什么代码无法正常工作。我刚刚阅读示例代码,其中有:'SecondViewController * aSecondView = [[SecondViewController alloc] initWithNibName:@“SecondView”bundle:nil];'这不是一回事吗?获取临时对象指针并初始化你想要的,然后设置一个从真实对象到启动的东西的指针。最后释放临时对象指针。 [self setSecondViewController:aSecondView]; [aSecondView发布]; –

+0

在这种情况下,'setSecondViewController:'将保留'aSecondView'(如果内部实现细节认为它是必要的 - 很可能它保留,它可能会做其他事情)。 – bbum

4

如果您正在使用-fobjc弧编译(即使用ARC),那么你不仅不需要调用release,它是一个编译错误,如果你这样做。使用ARC时,编译器的工作是为您插入retainrelease调用。

+0

所以它创建对象的方法是正确的(或更好)?我应该改变我所有的“realObject = [[ObjectClass alloc] init];”? –

+0

对象创建保持不变,IIRC。 – Wevah

+0

是 - 对象创建保持不变,代码中没有任何保留/释放。但问题在于,Tim的代码首先被破坏了。 – bbum