gpt4 book ai didi

objective-c - 初始化对象/ARC

转载 作者:行者123 更新时间:2023-12-03 16:50:50 25 4
gpt4 key购买 nike

前几天我问了一个愚蠢的问题(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]),我不清楚是否真的有区别?

最佳答案

retain 无法在 ARC 编译代码中调用。

为了回答您的问题,在非 ARC 环境中,这些实际上是相同的。

[NSMutableData data] 返回一个自动释放的对象,通过调用它的 retain 您将获得所有权并负责在某个时刻释放它。

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

不过,retain 不能在 ARC 编译的代码中使用,因此 NSMutableData* myData = [[NSMutableData data] keep]; 将无法编译。

进一步澄清一下,如果您使用 ARC,则可以使用以下任一行并且安全,您无需担心对象如何保留或释放。

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

编辑

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

关于objective-c - 初始化对象/ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8470657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com