【问题标题】:mutation within fast enumeration?快速枚举中的突变?
【发布时间】:2011-12-05 14:46:42
【问题描述】:

实际上我收到了一个奇怪的异常:我迭代了一个 MutableDictionary 并想在其中设置一个新值:

    selectionIndex = [NSMutableDictionary dictionaryWithDictionary:selection];
    NSString *whatever = @"999999";
    id keys;
    NSEnumerator *keyEnum = [selectionIndex keyEnumerator];

    while (keys = [keyEnum nextObject]) 
    {
        [selectionIndex setObject:whatever forKey:keys];
    }

顺便说一句,传递给这个方法的选择是一个 MutableDictionary。如果我运行此代码,我会收到以下异常:

2011-12-05 15:28:05.993 lovelini[1333:207] * 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“* 集合 <0x6a33ed0>

标签: iphone objective-c ios cocoa-touch


【解决方案1】:

枚举时不能对集合进行任何更改。您可以改为枚举字典的键而不是字典本身:

for (NSString *key in selectionIndex.allKeys) {
    [selectionIndex setObject:whatever forKey:key];
}

【讨论】:

    【解决方案2】:

    在枚举时更改值是一个坏主意,您可以将元素收集到一个新字典中,然后用新字典替换原来的字典。

    【讨论】:

      【解决方案3】:

      快速枚举仅用于查看集合中的对象。您不能修改元素。

      枚举是“安全的”——枚举器有一个突变保护,因此如果您在枚举期间尝试修改集合,则会引发异常。 AppleDeveloperPortal

      【讨论】:

      • 从技术上讲,您可以修改元素:如果您有NSMutableArray 或NSMutableStrings,则可以在枚举期间修改字符串;你不能做的是添加或删除他们。
      【解决方案4】:

      是的,您正在为您枚举的内容添加一些内容:

      [selectionIndex setObject:
      

      不是快速枚举的限制,而是一般枚举的限制。快速枚举是一种更方便(实际上更快)的枚举方式。 (见this comparison。)

      底线:在枚举集合时不要摆弄集合的内容,否则会遇到问题。

      【讨论】:

        【解决方案5】:

        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

            NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];
        
        
            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/services/userDATE.php?user_id=%@",MAINDOMAINURL,[[NSUserDefaults standardUserDefaults] objectForKey:@"USERID"]]];
        
        
        
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                                   cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                               timeoutInterval:60.0];
        
        
            NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                if (error == nil)
                {
                    NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc]init];
                    jsonDict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        
                    NSLog(@"DATA:%@",jsonDict);
        
                    NSLog(@"driver tracking ::%@",[jsonDict objectForKey:@"response"]);
                    if ([[jsonDict objectForKey:@"avialabity"] isEqualToString:@"yes"]) {
        
        
                            isDriverTracking=YES;
                            dispatch_async(dispatch_get_main_queue(), ^{
                                [self hideActivityIndicator];
                                [self performSegueWithIdentifier:@"FIRSTSEGUE" sender:nil];
                            });
        
        
                    }else{
                        dispatch_async(dispatch_get_main_queue(), ^{
                            [self hideActivityIndicator];
                            [self performSegueWithIdentifier:@"SECONDSEGUE" sender:nil];
                        });
                    }
                    [self hideActivityIndicator];
        
                }else [self customeAlertController:@"Alert !" :@"Plese check Your internet connection."];
            }];
            [postDataTask resume];
        

        I GOT SAME ERROR 在枚举时发生了变异。

        【讨论】:

          猜你喜欢
          • 2015-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-19
          • 2013-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多