init]在自动引用计数中

Tim*_*ple 3 xcode initialization objective-c alloc automatic-ref-counting

我知道我想要使用:

ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]
Run Code Online (Sandbox Code Playgroud)

初始化realObject(类中realObject的对象在哪里)

但是现在使用ARC模式,释放是自动的,我还需要使用这种技术吗?我可以简单地使用realObject = [[ObjectClass alloc] init];吗?如果没有,是否有任何具体原因会泄漏?

谢谢

bbu*_*bum 16

正如Spencer所说,如果你在启用ARC的情况下进行编译,则根本无法调用release.这样做是错误的,编译器会为您处理它.

然而:

ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]
Run Code Online (Sandbox Code Playgroud)

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

也就是说,编写的代码会在第一次尝试发送消息时导致崩溃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.    
Run Code Online (Sandbox Code Playgroud)

对于ARC,您只需执行以下操作:

realObject = [[ObjectClass alloc] init];
Run Code Online (Sandbox Code Playgroud)