初始化对象/ ARC

Rao*_*lin 1 cocoa cocoa-touch objective-c ios

前几天我问了一个愚蠢的问题(愚蠢的问题):

// line1
NSMutableData* myData = [NSMutableData data];
// line2
NSMutableData* myData = [[NSMutableData alloc] init];
Run Code Online (Sandbox Code Playgroud)

这是一个愚蠢的问题,我没有及时发现我的错误.我想问的是,有什么区别:

// line1 -- added retain
NSMutableData* myData = [[NSMutableData data] retain]; // added retain
// line2
NSMutableData* myData = [[NSMutableData alloc] init];
Run Code Online (Sandbox Code Playgroud)

这很可能仍然是一个愚蠢的问题......如果是这样的话,道歉!有真正的区别吗?用ARC?我已经看到NSXMLParser示例使用两种方法(一些Apple示例使用[[[NSMutableData alloc] init] autorelease])并且我不清楚是否真的有区别?

Chr*_*ner 7

retain 不能在ARC编译代码中调用.

但是,回答你的问题,在非ARC环境中,这几乎是一样的.

[NSMutableData data]返回一个自动释放的对象,通过调用retain它你正在拥有并负责在某个时候释放它.

[[NSMutableData alloc] init] 返回一个保留计数等于1的对象,因此您是所有者并负责在完成后释放它.

虽然再一次,retain不能在ARC编译代码中使用,所以NSMutableData* myData = [[NSMutableData data] retain];不会编译.

并且为了进一步说明,如果您使用ARC,则可以使用以下任一行并且是安全的,您无需担心如何保留或释放对象.

// line1 
NSMutableData* myData = [NSMutableData data];
// line2
NSMutableData* myData = [[NSMutableData alloc] init];
Run Code Online (Sandbox Code Playgroud)

编辑

此外,[[[NSMutableData data] retain] autorelease]这段代码是毫无意义和过分的.它的含义是"使用类方法给我一个自动发布的NSMutableData对象data,为我保留这个自动发布的对象,并将我现在拥有的这个对象添加回自动发布池." 因此基本上[NSMutableData data]可以在更少的代码和更少的开销中实现相同的结果.如果你真的在Apple的例子中看过这样的一行,我会感到惊讶.