2011-02-28 8 views
1

이 코드가 있으며 중첩 된 사전에서 항목을 제거한 다음 사전을 NSUserdefaults에 다시 쓰려고합니다. 새 드라이버를로드 한 다음 다시 제거하려고하면 프로그램이 충돌합니다. 제거를위한 제 코드는 다음과 같습니다.중첩 된 사전에서 항목 제거

-(void)Remove:(id)sender 
{ 
    subsDict = [[[[[NSUserDefaults standardUserDefaults] objectForKey:@"Subs"]retain] mutableCopy]autorelease]; 
    NSLog(@"%@",modelDict); 
    NSLog(@"Removing Size %@",driverSize); 
    [[[subsDict objectForKey:driverBrand]objectForKey:driverModel]removeObjectForKey:driverSize]; //Crashes here 
    [self updateSizes]; 
    NSLog(@"New sizearray:%i",[sizeArray count]); 

    if ([sizeArray count] == 0) 
    { 
      [brandDict removeObjectForKey: driverModel]; 
     [self updateModels]; 
     NSLog(@"New modelarray count:%i",[modelArray count]); 
     NSLog(@"driver model: %@ Modelarray %@",driverModel, modelArray); 
     if ([modelArray count] == 0) { 
      [subsDict removeObjectForKey:driverBrand]; 

     } 
    } 
    NSLog(@"New subdict:%@",subsDict); 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:subsDict forKey:@"Subs"]; 
    [userDefaults synchronize]; 
} 
+0

죄송합니다, 충돌 오류는 - [NSCFDictionary removeObjectForKey :] : 변하기 쉬운 메소드가 불변의 객체로 전송되었습니다. –

+0

brandDict에 대한 선언이 코드 스 니펫에 없습니다. 변경 가능한 DICT인지 아니면 subsDict에서했던 것처럼 mutablecopy 했습니까? – Toastor

답변

2

받고있는 오류 메시지는 수정하려는 사전이 NSMutableDictionary가 아닌 NSDictionary임을 나타냅니다.

NSUserSettings에서 반환 된 개체에 mutableCopy을 호출하면 변경 가능한 사전이됩니다. 그러나 값을 변경하지는 않습니다. 특히 키 driverBrand의 값인 사전은 키 내부의 사전 인 driverModel과 같이 계속 변경되지 않습니다.

여기서하고 싶은 일을하려면 길을 따라 각 하위 사전의 변경 가능한 복사본을 만들어 부모에게 다시 할당해야합니다.

또한, 첫 번째 줄에는 메모리가 누설 될 수 있습니다. [[[[NSUserDefaults standardUserDefaults] objectForKey:@"Subs"] mutableCopy] autorelease]이어야합니다.