为什么循环变量在循环后变为“nil”
Why does loop variable become `nil` after loop
我有:
NSDictionary* server;
for (server in self.servers)
{
if (<some criterium>)
{
break;
}
}
// If the criterium was never true, I want to use the last item in the
// the array. But turns out that `server` is `nil`.
循环块永远不会改变server
。
servers
是一个带字典的 NSMutableArray
,一个在循环期间不会改变的 属性。
为什么循环结束后server
的值为nil
?
第一次在循环后使用这样的变量。没有想太多,我假设它会像(在旧的 C 时代)那样工作:
int i;
for (i = 0; i < n; i++)
{
...
}
当循环结束时,for-loop
中使用的变量将始终为 nil
(除非循环被 break
语句中断,正如@rmaddy 所指出的)。
另一种避免误解的循环方式是:
for (NSDictionary* server in self.servers)
{
//... server is not nil
}
//here server doesn't exist (out of scope)
如果您想在循环外的变量中保存 self.servers 的值,您必须这样做:
NSDictionary* serverSave;
for (NSDictionary* server in self.servers)
{
serverSave = server;
}
//here you can use serverSave, which will contain the last value of self.servers
希望这对您有所帮助。
循环后为零,因为 Objective-C 使用 ARC 将其设为零(参见 Value of loop variable after "for in" loop in Objective C)。
因此,当您到达结尾时:
NSDictionary* server; // server is nil here
for (server in self.servers)
{
... // Does not set server to nil.
}
server
将为零。
如果您正在寻找某个值,您可以这样做:
NSDictionary *dict;
for (NSDictionary* server in self.servers)
{
if (server == whatever you want){
dict = server;
break;
}
}
或者只获取最后一个值:
NSDictionary *dict;
for (NSDictionary* server in self.servers)
{
dict = server;
}
语言定义当循环退出时循环变量将被设置为nil。该语言并未声明循环变量将具有最后一个值,恰恰相反。
在幕后,这是有充分理由的。快速迭代对基础数据做出假设。例如,当您迭代一个可变数组时,该数组可能不会在您迭代时被修改。快速迭代速度很快,除此之外,因为它不保留和释放循环变量。相反,它依赖于底层对象(例如数组)来保存引用。
但是一旦循环退出,底层对象就不再提供任何保证。该数组可能会消失,或者最后使用的数组元素可能会被删除。所以编译器要么必须保留变量,要么将其设置为 nil。设置为 nil 会更快。
我有:
NSDictionary* server;
for (server in self.servers)
{
if (<some criterium>)
{
break;
}
}
// If the criterium was never true, I want to use the last item in the
// the array. But turns out that `server` is `nil`.
循环块永远不会改变server
。
servers
是一个带字典的 NSMutableArray
,一个在循环期间不会改变的 属性。
为什么循环结束后server
的值为nil
?
第一次在循环后使用这样的变量。没有想太多,我假设它会像(在旧的 C 时代)那样工作:
int i;
for (i = 0; i < n; i++)
{
...
}
当循环结束时,for-loop
中使用的变量将始终为 nil
(除非循环被 break
语句中断,正如@rmaddy 所指出的)。
另一种避免误解的循环方式是:
for (NSDictionary* server in self.servers)
{
//... server is not nil
}
//here server doesn't exist (out of scope)
如果您想在循环外的变量中保存 self.servers 的值,您必须这样做:
NSDictionary* serverSave;
for (NSDictionary* server in self.servers)
{
serverSave = server;
}
//here you can use serverSave, which will contain the last value of self.servers
希望这对您有所帮助。
循环后为零,因为 Objective-C 使用 ARC 将其设为零(参见 Value of loop variable after "for in" loop in Objective C)。
因此,当您到达结尾时:
NSDictionary* server; // server is nil here
for (server in self.servers)
{
... // Does not set server to nil.
}
server
将为零。
如果您正在寻找某个值,您可以这样做:
NSDictionary *dict;
for (NSDictionary* server in self.servers)
{
if (server == whatever you want){
dict = server;
break;
}
}
或者只获取最后一个值:
NSDictionary *dict;
for (NSDictionary* server in self.servers)
{
dict = server;
}
语言定义当循环退出时循环变量将被设置为nil。该语言并未声明循环变量将具有最后一个值,恰恰相反。
在幕后,这是有充分理由的。快速迭代对基础数据做出假设。例如,当您迭代一个可变数组时,该数组可能不会在您迭代时被修改。快速迭代速度很快,除此之外,因为它不保留和释放循环变量。相反,它依赖于底层对象(例如数组)来保存引用。
但是一旦循环退出,底层对象就不再提供任何保证。该数组可能会消失,或者最后使用的数组元素可能会被删除。所以编译器要么必须保留变量,要么将其设置为 nil。设置为 nil 会更快。