是吗?
我通常会选择这个,
NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];
[self setMonths: monthsForChosenYear];
在此之上,
[self setMonths: [self monthsForYear:newChosenYear]];
主要是因为乍一看很容易理解。第二种方法,不是那么多。
但这究竟意味着什么呢? monthsForChosenYear,只是一个指针,但它必须以某种方式存储。
我不是在问这个影响是否太小以至于我不需要担心它。但我对此非常好奇。
即使重定向到更详细解释的某个文档也不错。
提前谢谢!
努诺
答案 0 :(得分:5)
一个很长的答案,希望能缓和你的好奇心,好奇心好!表演&内存影响要么为零,要么微不足道。你想知道指针是如何存储的。当您输入:
NSArray * monthsForChosenYear;
您要求在名称monthsForChosenYear
中引用一个框(变量),以便在本地存储中分配。当封闭方法退出时,此框将自动回收,并且可能早于编译器发现不再需要它的时间。此框可以包含NSArray *
类型的值。
键入时:
NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];
你要求两件事,它只是一个简写:
NSArray * monthsForChosenYear;
monthsForChosenYear = [self monthsForYear:newChosenYear];
,第二行调用方法并将返回的值存储在名为monthsForChosenYear
的框中。最后当你输入:
[self setMonths: monthsForChosenYear];
存储在您的方框monthsForChosenYear
中的值将传递给方法。如果您不再使用框monthsForChosenYear
,编译器可能会回收它,或者它可能会等到封闭方法结束或其他一些合适的点。
编译器分析盒子的使用情况并进行优化,如果确定不需要盒子,有时他们甚至不会分配盒子。分配盒子的成本是无穷小的。
* [注意:实际上通常有两种本地方框。第二个,通常称为寄存器,其分配成本通常甚至小于无穷小。使用哪种框由编译器决定。] *
键入时:
[self setMonths: [self monthsForYear:newChosenYear]];
您要求在一行中调用两个方法,并且必须将内部调用([self monthsForYear:newChosenYear]
)返回的值传递给外部调用。编译器在哪里存储此结果?编译器实际上将上述内容转换为:
NSArray *compilerTemporaryBox = [self monthsForYear:newChosenYear];
[self setMonths:compilerTemporaryBox];
从上面你知道这是怎么回事。 编译器有一个小优点,因为它知道需要多长compilerTemporaryBox
,所以它不需要弄清楚,但这不会影响编译代码。< / p>
所以,总的来说,无论你怎么写它都没关系。
此外,您使用的内存管理类型:MRC,ARC或GC;不会影响答案 - 编译器最终会同时处理你的变体。
所以请选择最适合自己的款式。 HTH。
答案 1 :(得分:1)
Clang几乎肯定足够聪明,可以将这两段代码编译成相同的结果机器代码。速度或内存问题没有区别。
答案 2 :(得分:0)
你在使用ARC吗?没有ARC,使用不错的优化器就没有区别,但是使用ARC可能会使用额外的保留/释放。