2

这两个objective-c语句有什么区别?

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath];

与此相比:

NSData *documentBytes = [NSData initWithContentsOfFile:filePath];

从 Apple 的 NSData 类参考页面,它陈述了以下关于每个

dataWithContentsOfFile - 通过从给定路径指定的文件中读取每个字节来创建并返回一个数据对象。

initWithContentsOfFile - 返回一个通过从给定路径指定的文件中读取数据而初始化的数据对象。

对我来说,这些看起来在功能上是等效的,但我非常怀疑它们在所有情况下都做同样的事情,对吧?

在此先感谢... -Ergin

4

2 回答 2

4

当您使用 时init,您总是必须使用alloc,如下所示:

NSData *documentBytes = [[NSData alloc] initWithContentsOfFile:filePath];

这将返回一个保留计数为 1 的 NSData 对象,您现在拥有该引用并负责释放它。

使用时dataWithContentsOfFile

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath];

你得到一个自动释放的 NSData 对象。你可以使用它而忘记它,自动释放池会处理它。如果你想存储它,你必须保留它。

当然,当您使用 ARC 时,您可以忘记所有这些 ;-),方法本质上是相同的。

于 2013-05-24T23:05:58.370 回答
0

第二

NSData *documentBytes = [NSData initWithContentsOfFile:filePath];

不会编译你需要先分配它,看起来像:

NSData *documentBytes = [[NSData alloc] initWithContentsOfFile:filePath];

但是一个或另一个会起作用,最后你将拥有一个包含文件内容的 NSData。第一个是捷径。

所以关于你的疑问:

第一个你不需要先分配对象,该方法会为你返回对象,如果你不使用 ARC(我不这么认为),第一个将返回一个系统会处理的对象。

第二个你需要先分配对象,该方法只初始化你的对象,如果你不使用 ARC,你需要小心释放它。

于 2013-05-24T23:00:14.650 回答