正如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];
谢谢,这是一个明确的解释:D。 –
我不明白为什么代码无法正常工作。我刚刚阅读示例代码,其中有:'SecondViewController * aSecondView = [[SecondViewController alloc] initWithNibName:@“SecondView”bundle:nil];'这不是一回事吗?获取临时对象指针并初始化你想要的,然后设置一个从真实对象到启动的东西的指针。最后释放临时对象指针。 [self setSecondViewController:aSecondView]; [aSecondView发布]; –
在这种情况下,'setSecondViewController:'将保留'aSecondView'(如果内部实现细节认为它是必要的 - 很可能它保留,它可能会做其他事情)。 – bbum