nmd*_*ias 2 variables performance objective-c
可以?
我通常会选这个,
NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];
[self setMonths: monthsForChosenYear];
Run Code Online (Sandbox Code Playgroud)
在此之上,
[self setMonths: [self monthsForYear:newChosenYear]];
Run Code Online (Sandbox Code Playgroud)
主要是因为乍一看很容易理解.第二种方法,不是那么多.
但这究竟意味着什么呢?monthsForChosenYear,只是一个指针,但它必须以某种方式存储.
我不是在问这个影响是否太小以至于我不需要担心它.但我对此非常好奇.
即使重定向到一些更详细解释的文档也会很好.
先感谢您!
努诺
一个很长的答案,希望能缓和你的好奇心,好奇心好!性能和内存影响为零或微小.你想知道指针是如何存储的.键入时:
NSArray * monthsForChosenYear;
Run Code Online (Sandbox Code Playgroud)
您要求在名称中引用的框(变量)monthsForChosenYear将在本地存储中分配.当封闭方法退出时,此框将自动回收,并且可能早于编译器发现不再需要它的时间.此框可以包含类型的值NSArray *.
键入时:
NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear];
Run Code Online (Sandbox Code Playgroud)
你要求两件事,它只是一个简写:
NSArray * monthsForChosenYear;
monthsForChosenYear = [self monthsForYear:newChosenYear];
Run Code Online (Sandbox Code Playgroud)
第二行调用一个方法并将返回的值存储在名为的框中monthsForChosenYear.最后当你输入:
[self setMonths: monthsForChosenYear];
Run Code Online (Sandbox Code Playgroud)
存储在您的框中的值将monthsForChosenYear传递给方法.如果您不再使用该框,monthsForChosenYear则编译器可能会回收它,或者它可能会等到封闭方法结束或其他一些合适的点.
编译器分析盒子的使用和优化,有时如果确定不需要盒子,他们甚至不会分配盒子.分配盒子的成本是无穷小的.
*[注意:实际上通常有两种本地方框.第二种,通常称为寄存器,其分配成本通常甚至小于无穷小.使用哪种框由编译器决定.]*
键入时:
[self setMonths: [self monthsForYear:newChosenYear]];
Run Code Online (Sandbox Code Playgroud)
您要求在一行中调用两个方法,并且从内部调用([self monthsForYear:newChosenYear])返回的值必须传递给外部调用.编译器在哪里存储此结果?编译器实际上将上述内容转换为:
NSArray *compilerTemporaryBox = [self monthsForYear:newChosenYear];
[self setMonths:compilerTemporaryBox];
Run Code Online (Sandbox Code Playgroud)
从上面你知道这是怎么回事.编译器有一个小优点,它知道compilerTemporaryBox需要多长时间,所以它不需要弄清楚,但这不会影响编译代码.
毕竟,总的答案是你如何写它并不重要.
此外,您使用的内存管理类型:MRC,ARC或GC; 不会影响答案 - 编译器最终会同时处理你的变体.
那么请选择最适合您的款式.HTH.