我很好奇,但下面的单行初始化和添加到数组中对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]];
该对象被传递给保留该对象的NSArray
的addObject
方法。
在第二种情况下,
Event *event = [Event getEvent:item];
[events addObject:event];
第一行创建了一个强引用(保留对象)。(这是如4.2所述。语义学在"Clang/ARC"文档中。)然后addObject
第二行中的调用再次保留它。当局部变量event
超出范围,强引用被销毁,对象被释放。
所以最终结果是一样的。对于内存语义。它们最多在一个附加的保留/释放呼叫中不同,但在"记忆影响"方面没有区别。
你应该选择你更了解的东西。
还请注意ARC编译器在优化/删除不必要的内容方面非常聪明retain/release调用,因此我强烈认为在发布构建中编译后的代码将不会有任何差异。