初始化对象/ ARC

时间:2011-12-12 06:26:37

标签: objective-c ios cocoa-touch cocoa

前几天我问了一个愚蠢的问题(dumb question)关于:

之间的区别
// line1
NSMutableData* myData = [NSMutableData data];
// line2
NSMutableData* myData = [[NSMutableData alloc] init];

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

// line1 -- added retain
NSMutableData* myData = [[NSMutableData data] retain]; // added retain
// line2
NSMutableData* myData = [[NSMutableData alloc] init];

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

1 个答案:

答案 0 :(得分:7)

无法在ARC编译代码中调用

retain

虽然回答你的问题,但在非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];

修改

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