iOS ARC应用程序和一行或两行对象初始化



我很好奇,但下面的单行初始化和添加到数组中对ARC应用程序的内存有影响吗?其中一个可以吗,还是我应该用一个代替另一个?

[events addObject:[Event getEvent:item]];

Event *event = [Event getEvent:item];
[events addObject:event];

在您的示例中,两者都将编译为相同的二进制文件,因此根本没有区别。

唯一的区别是

Event *event = [Event getEvent:item];

生成一个l值,因此如果需要,您可以获得它的地址,而第二个生成一个r值。但如果你不使用前者作为l值,它将按照相同的说明进行优化。

我的意思是,如果你需要,你可以做:

Event *event = [Event getEvent:item];
Event **event = &event;

[Event getEvent:item]返回一个调用者不拥有的对象(一个+0保留的对象,它可能是一个自动释放的对象)。

在第一种情况下,可能应该是

[events addObject:[Event getEvent:item]];

该对象被传递给保留该对象的NSArrayaddObject方法。

在第二种情况下,

Event *event = [Event getEvent:item];
[events addObject:event];

第一行创建了一个强引用(保留对象)。(这是如4.2所述。语义学在"Clang/ARC"文档中。)然后addObject第二行中的调用再次保留它。当局部变量event超出范围,强引用被销毁,对象被释放。

所以最终结果是一样的。对于内存语义。它们最多在一个附加的保留/释放呼叫中不同,但在"记忆影响"方面没有区别。

你应该选择你更了解的东西。

还请注意ARC编译器在优化/删除不必要的内容方面非常聪明retain/release调用,因此我强烈认为在发布构建中编译后的代码将不会有任何差异。

最新更新