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

时间:2013-12-31 15:55:37

标签: ios objective-c automatic-ref-counting

我很好奇,但是下面的一行初始化并添加到数组会对ARC应用程序产生任何内存影响吗?是一个好,还是我应该使用另一个?

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

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

2 个答案:

答案 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编译器非常聪明地优化/删除不必要的东西 保留/释放调用,因此我强烈假设在发布版本中 在编译的代码中根本没有任何区别。