这两个Objective-c语句之间有什么区别?
NSData *documentBytes = [NSData dataWithContentsOfFile:filePath];
与此相对:
NSData *documentBytes = [NSData initWithContentsOfFile:filePath];
从Apple的NSData Class Reference页面,它说明了每个
dataWithContentsOfFile - 通过读取给定路径指定的文件中的每个字节来创建并返回数据对象。
initWithContentsOfFile - 返回通过从给定路径指定的文件中读取数据而初始化的数据对象。
对我而言,这些似乎功能相同,但我非常怀疑他们在所有情况下都做同样的事情,对吧?
提前致谢... -Ergin
答案 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,则需要注意释放它。