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