带指针的辅助变量是否会对性能/内存产生影响?

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,只是一个指针,但它必须以某种方式存储.

我不是在问这个影响是否太小以至于我不需要担心它.但我对此非常好奇.

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

先感谢您!

努诺

CRD*_*CRD 5

一个很长的答案,希望能缓和你的好奇心,好奇心好!性能和内存影响为零或微小.你想知道指针是如何存储的.键入时:

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.