2011-04-26 3 views
13

이 메서드를 처음 사용할 때 제대로 작동하지만 두 번째로 호출 할 때 "변경 메서드가 불변 개체로 전송 됨"오류가 발생합니다. 문제는 "addObject"명령과 일치합니다.변경 메서드가 불변 개체로 전송

-(IBAction) save: (id) sender{ 

NSMutableArray *placesT= [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; 

} NSUserDefaults에 대한 문서로

+0

문제는 placesT 초기화에 있습니다. 내 내기는 처음에는 NSUserDefault 표준이 비어 있고 두 번째 init로 이동합니다. 당신은 또한 메모리 누수가 있습니다. – Radu

+0

'[NSString stringWithFormat : @ "% @", tagF.text]'를'tagF.text'로만 대체 할 수 있습니다. 'text'가 이미'NSString' 인 경우'+ stringWithFormat :'을 보낼 필요가 없습니다. –

답변

24

는 말한다 : "NSUserDefaults에서 반환 된 값은이 값으로 변경 가능한 객체를 설정 한 경우에도, 불변입니다." NSUserDefaults에서 가져온 콜렉션을 변경할 때마다 불변 버전을 가져와 mutableCopy으로 만들고 수정 한 다음 다시 설정해야합니다.

+2

예를 들면 다음과 같습니다. someMutableArray = [yourArrayFromDictionary mutableCopy]; 도움이 된 희망 : – jimbob

10

NSUserDefaults에 저장된 객체가 mutableArray가 아닌 일반 배열이기 때문입니다.

- (IBAction)save:(id)sender { 

    NSMutableArray *placesT = nil; 
    NSArray *tempArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

    if (tempArray) { 
     placesT = [tempArray mutableCopy]; 
    } else { 
     placesT = [[NSMutableArray alloc] init]; 
    } 

    [placesT addObject:[NSString stringWithFormat:@"%@", tagF.text]]; 

    NSUserDefaults *tUD = [NSUserDefaults standardUserDefaults]; 
    [tUD setObject:placesT forKey:@"placesT"]; 
    [tUD synchronize]; 

    [self dismissModalViewControllerAnimated:YES]; 
    [placesT release]; 
} 
+0

당신은 사본을 유출하고 있습니다. – smorgan

+0

@smorgen, 당신은 완전히 옳습니다. – rckoenes

3

placesT 중 하나를 항상 placesT 다음 코드 변경 가능한 항상 객체 또는 사용 설정, 비 가변 배열입니다.

NSMutableArray *placesT= [[[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"] mutableCopy]; 
0

이 작동합니다 :

- (IBAction를) 저장 (ID) 보낸 사람 {

NSMutableArray *placesT= [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] 

objectForKey : "placesT"@]];

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; } 
관련 문제