Objective-c - NSData initWithContentsOfFile与dataWithContentsOfFile

时间:2013-05-24 22:57:06

标签: objective-c nsdata

这两个Objective-c语句之间有什么区别?

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath];

与此相对:

NSData *documentBytes = [NSData initWithContentsOfFile:filePath];

从Apple的NSData Class Reference页面,它说明了每个

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

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

对我而言,这些似乎功能相同,但我非常怀疑他们在所有情况下都做同样的事情,对吧?

提前致谢... -Ergin

2 个答案:

答案 0 :(得分:4)

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

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

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

使用dataWithContentsOfFile

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath];

您将获得一个自动释放的NSData对象。您可以使用它并忘记它,自动释放池将负责它。如果你想存储它,你必须保留它。

当然,当你使用ARC时,你可以忘记所有这些;-),方法基本相同。

答案 1 :(得分:0)

第二个

NSData *documentBytes = [NSData initWithContentsOfFile:filePath];

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

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

但是一个或另一个将工作相同,最后你将有一个具有该文件的竞争的NSData。第一个是捷径。

关于你的疑问:

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

您需要先分配对象的第二个,该方法仅初始化您的对象,如果您不使用ARC,则需要注意释放它。