前几天我问了一个愚蠢的问题(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])并且我不清楚是否真的存在差异?
答案 0 :(得分:7)
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的例子中看过这样的一行,我会感到惊讶。