我很好奇,但是下面的一行初始化并添加到数组会对ARC应用程序产生任何内存影响吗?是一个好,还是我应该使用另一个?
[events addObject:[Event getEvent:item]];
或
Event *event = [Event getEvent:item];
[events addObject:event];
答案 0 :(得分:4)
两者都将在您的示例中编译为相同的二进制文件,因此完全没有区别。
唯一的区别是
Event *event = [Event getEvent:item];
产生一个l-value,这样你就可以在必要时获得它的地址,而第二个产生一个r值。但是如果你不使用前者作为l值,它将被优化为相同的指令。
我的意思是,如果您需要,您可以这样做:
Event *event = [Event getEvent:item];
Event **event = &event;
答案 1 :(得分:3)
[Event getEvent:item]
返回调用者不拥有的对象(+0保留对象,它可能是自动释放的对象)。
在第一种情况下,可能应该是
[events addObject:[Event getEvent:item]];
此对象传递给保留对象的addObject
NSArray
方法。
在第二种情况下
Event *event = [Event getEvent:item];
[events addObject:event];
第一行创建一个强引用(保留对象)。 (这是
在4.2. Semantics中解释
在" Clang / ARC"文档)。
那么addObject
第二行的电话再次保留。当局部变量event
出现时
超出范围,强大的参考被破坏,对象被释放。
所以净结果是一样的。两种方法相对于同样正确 记忆语义。它们在一次额外的保留/释放呼叫中最多不同, 但是内存影响并没有区别。
你应该选择你理解得更好的东西。
还要注意 ARC编译器非常聪明地优化/删除不必要的东西 保留/释放调用,因此我强烈假设在发布版本中 在编译的代码中根本没有任何区别。