2

可以?

我通常会选择这个,

NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];
[self setMonths: monthsForChosenYear];

对此,

[self setMonths: [self monthsForYear:newChosenYear]];

主要是因为乍一看很容易理解。第二种方法,没有那么多。

但这究竟意味着什么?monthsForChosenYear,只是一个指针,但它必须以某种方式存储。

我不是在问影响是否小到我不需要担心。但我对此非常好奇。

即使重定向到一些更详细解释的文档也会很好。

先感谢您!

努诺

4

3 回答 3

5

希望能缓解你的好奇心的长答案,有好奇心是件好事!性能和内存影响为零或微乎其微。你想知道指针是如何存储的。当您键入:

NSArray * monthsForChosenYear;

您要求monthsForChosenYear在本地存储中分配一个由 name 引用的框(变量)。当封闭方法退出时,这个框将被自动回收,如果编译器发现不再需要它,可能会更早。此框可以保存 type 的值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,因此不需要计算出来,但这不会影响编译后的代码。

所以毕竟总体答案是不管你怎么写。

此外,您使用的内存管理类型:MRC、ARC 或 GC;不会影响答案 - 编译器最终会将您的两个变体视为相同。

所以选择你认为最适合你的风格。HTH。

于 2012-08-21T20:31:17.330 回答
1

几乎可以肯定,Clang 足够聪明,可以将这两段代码编译成相同的机器代码。在速度或内存问题方面没有区别。

于 2012-08-21T20:04:07.823 回答
0

你在用ARC吗?没有 ARC,使用不错的优化器就没有区别,但是使用 ARC,它可能会使用额外的保留/释放。

于 2012-08-21T20:04:12.907 回答