[[alloc] init]和[[thing] retain]之间有什么区别?

Tim*_*Tim 1 memory-management objective-c

我想知道,使用以下方法创建对象之间的区别是什么(如果有的话):

NSThing *thing = [[NSThing alloc] initWithObject:object];
Run Code Online (Sandbox Code Playgroud)

VS

NSThing *thing = [[NSThing thingWithObject:object] retain];
Run Code Online (Sandbox Code Playgroud)

内存管理的工作方式有区别吗?此外,什么时候通常的做法是使用一个与另一个?

dre*_*lax 8

分配和初始化一个对象稍微有点效率,因为它thingWithObject:会执行一个alloc,然后init,然后autorelease用a计数retain,所以你向自动释放池添加一些东西.第一个选项只涉及a alloc和a init.

就个人而言,alloc当我想要明确对象的生命周期将由我处理时,我使用显式,并且我使用方便方法(thingWithThing:)用于在创建范围之外我不需要的任何对象.

例如,通常首选在循环中显式分配和初始化,因此您不会使自动释放池泛滥.对于需要在运行循环的迭代中存活的对象,我还使用显式alloc+ init而不是thingWithThing:+ retain.