当您不声明一个变量时,compiler/runtime 是否会默默地为您声明一个变量?
Is a variable silently declared for you by the compiler/runtime when you don't declare one?
当我的方法只有一个 return 语句和一个值时:
-(id)doSomethingCool
{
return [someArray objectAtIndex:2];
}
...是编译器(或运行时)实际上在幕后添加了一个中间变量:
-(id)doSomethingCool
{
id someObject = [someArray objectAtIndex:2];
return someObject;
}
我猜在汇编级别它可能会做这样的事情?
我意识到这对 99% 的应用程序来说是一个晦涩且可能无关紧要的问题,但我仍然很好奇 Objective-C 幕后究竟发生了什么,如果有人知道的话。
顺便说一句,人们使用第一种技术的唯一原因是否只是为了 shorthand 方便,即使经过数千万次迭代,如果他们采用第二种方法也没有什么不同?
从概念上讲,基本上就是这样。从函数返回的值是一个临时值。它实际上是您返回的任何值的副本,它一直存在,直到使用方法调用的表达式结束。
实际上,当您在启用优化的情况下(在发布模式下)进行编译时,您给出的两个示例将生成相同的目标代码。两者之间的区别主要在于样式,尽管在局部变量中显式存储值在调试时很有用。
当我的方法只有一个 return 语句和一个值时:
-(id)doSomethingCool
{
return [someArray objectAtIndex:2];
}
...是编译器(或运行时)实际上在幕后添加了一个中间变量:
-(id)doSomethingCool
{
id someObject = [someArray objectAtIndex:2];
return someObject;
}
我猜在汇编级别它可能会做这样的事情?
我意识到这对 99% 的应用程序来说是一个晦涩且可能无关紧要的问题,但我仍然很好奇 Objective-C 幕后究竟发生了什么,如果有人知道的话。
顺便说一句,人们使用第一种技术的唯一原因是否只是为了 shorthand 方便,即使经过数千万次迭代,如果他们采用第二种方法也没有什么不同?
从概念上讲,基本上就是这样。从函数返回的值是一个临时值。它实际上是您返回的任何值的副本,它一直存在,直到使用方法调用的表达式结束。
实际上,当您在启用优化的情况下(在发布模式下)进行编译时,您给出的两个示例将生成相同的目标代码。两者之间的区别主要在于样式,尽管在局部变量中显式存储值在调试时很有用。