Objective c 为什么循环变量在循环之后变为“nil”

Objective c 为什么循环变量在循环之后变为“nil”,objective-c,cocoa,nsdictionary,fast-enumeration,nsfastenumeration,Objective C,Cocoa,Nsdictionary,Fast Enumeration,Nsfastenumeration,我有: 循环结束时,for循环中使用的变量始终为nil(除非循环使用@rmaddy所指出的break语句中断) 另一种避免误解的方法是: int i; for (i = 0; i < n; i++) { ... } 如果要在循环外部的var中保存self.servers的值,则必须执行以下操作: for (NSDictionary* server in self.servers) { //... server is not nil } //here server does

我有:


循环结束时,
for循环
中使用的变量始终为
nil
(除非循环使用@rmaddy所指出的
break
语句中断)

另一种避免误解的方法是:

int i;
for (i = 0; i < n; i++)
{
    ...
}
如果要在循环外部的var中保存self.servers的值,则必须执行以下操作:

for (NSDictionary* server in self.servers)
{
    //... server is not nil
}
//here server doesn't exist (out of scope)

希望这有帮助。

循环后为零,因为Objective-C和ARC为零(请参阅)

因此,当您到达以下步骤的末尾时:

NSDictionary* serverSave;

for (NSDictionary* server in self.servers)
{
    serverSave = server;
}
//here you can use serverSave, which will contain the last value of self.servers
服务器
将为零

如果您正在寻找某个值,可以执行以下操作:

NSDictionary* server; // server is nil here

for (server in self.servers)
{
    ... // Does not set server to nil.
}
或仅获取最后一个值:

NSDictionary *dict;

for (NSDictionary* server in self.servers)
{
    if (server == whatever you want){
        dict = server;
        break;
    }
}
该语言定义当循环退出时,循环变量将设置为nil。该语言没有声明循环变量将具有最后一个值,相反

在幕后,这是一个很好的理由。快速迭代对底层数据进行假设。例如,当您在可变数组上迭代时,在迭代时可能不会修改该数组。快速迭代是快速的,因为它不保留和释放循环变量。相反,它依赖于底层对象(例如数组)来保存引用


但一旦循环退出,底层对象就不再提供任何保证。数组可能会消失,或者上次使用的数组元素可能会被删除。因此编译器要么保留变量,要么将其设置为nil。设置为零更快

循环必须退出somewhow,因此当它在self.servers中用完要为循环分配给服务器的内容时,nil是逻辑结束值。第二个“server”变量是否是一个单独的声明?也就是说,它的作用域是否仅限于for块(意味着从未分配给原始变量)?如果您在集合中搜索特定对象,并且在找到该对象时,
中断
循环,则该功能非常有用。如果循环变量以值
nil
结尾,则循环未找到所需的对象。您的注释可能与@MarcB重复,这很有意义。循环在迭代所有值时存在。无需仅为结束循环而将
server
分配给任何特定值。只有当快速枚举完成对整个列表的迭代时,这才是正确的。如果循环提前中断,则循环变量(在循环之前声明)将具有最后一个值。只有循环完全运行时,才会将其设置为
nil
。在上两个示例中,没有理由在循环之前声明
server
。实际上这样做更让人困惑。@rmaddy,我只是保持它与问题中的一样。不,循环后它不会总是
nil
。只有当允许循环迭代整个列表时,才是这样。如果循环提前结束(例如,通过
break
),则变量将引用循环退出时的任何值。
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;
}