Objective c 自动引用计数中的init]

Objective c 自动引用计数中的init],objective-c,xcode,initialization,alloc,automatic-ref-counting,Objective C,Xcode,Initialization,Alloc,Automatic Ref Counting,我知道我应该使用: ObjectClass *tmpObject = [[ObjectClass alloc] init]; realObject = tmpObject; [tmpObject release] 初始化realObject(其中realObject是类中的对象) 但是现在使用ARC模式,释放是自动的,我还需要使用这种技术吗? 我可以简单地使用realObject=[[ObjectClass alloc]init]? 如果没有,是否有任何具体原因导致泄漏 谢谢如果您使用-fob

我知道我应该使用:

ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]
初始化
realObject
(其中
realObject
是类中的对象)

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


谢谢

如果您使用-fobjc-arc(即,使用arc)进行编译,那么您不仅不需要调用
release
,而且这样做是一个编译器错误。使用ARC时,编译器的工作是插入
retain
并调用
release

正如Spencer所说,如果启用ARC进行编译,则根本无法调用
release
。这样做是错误的,编译器会替您处理

然而:

ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]
在这种情况下,
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.    

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

realObject = [[ObjectClass alloc] init];

那么,哪种创建对象的方法是正确的(或更好的)?我是否应该更改所有的“realObject=[[ObjectClass alloc]init];”?对象创建保持不变,IIRC。是的——对象创建保持不变,只是代码中没有任何保留/释放。但问题是Tim的代码一开始就被破坏了,我不明白为什么代码不起作用。我刚刚读到的示例代码是:'SecondViewController*aSecondView=[[SecondViewController alloc]initWithNibName:@“SecondView”bundle:nil];'这不是一回事吗?获取所需的temp对象指针和init,然后设置一个从实际对象到启动对象的指针。最后释放临时对象指针。[self-setSecondViewController:aSecondView];[第二次发布];在这种情况下,
setSecondViewController:
将保留
aSecondView
(如果内部实现细节认为有必要——很可能保留,它可能会执行其他操作)。