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])并且我不清楚是否真的有区别?
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的例子中看过这样的一行,我会感到惊讶.
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |