2010-12-06 5 views
0

나는이 문제에 관해서 온통 보았다. 내가하려고하는 것은 nsuser defaults 객체를 만든 다음 변경 가능한 배열을 추가하고 nsuserdefaults 객체를 수정하는 것입니다. 하나 [defaults synchronize] does'nt 도움을 추가iphone xcode; mutableCopy 여전히 불변?

//Created a sample array 
NSMutableArray *xml=[[NSMutableArray alloc] init]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
[xml addObject:@"x"]; 
//assigned to defaults object which is created previously with a mutableCopy 
[defaults setObject:[xml mutableCopy] forKey:@"userLocationsDetailedXML"]; 
//Tried to modify the defaults object - which at this point should be mutable 
[[defaults objectForKey:@"userLocationsDetailedXML" ] replaceObjectAtIndex:1 withObject:@"y"] ; 

.

하지만 놀랍게도 defaults 객체는 여전히 변경할 수 없습니다. 예상대로 __NSCFArrayM이 아닌 __NSCFArray입니까 제안 사항이 있습니까?

편집 : 콘솔 출력 클래스 : 내가 변경 가능한 사본을 생성하기 때문에 __NSCFArray =이>는 _ NSCFArrayM 될 SHould'nt? [ _NSCFArray replaceObjectAtIndex : withObject는 :] 불변 오브젝트

답변

1

전송 돌연변이 방법 알아서한다

[(NSMutableArray *)[defaults objectForKey:@"userLocationsDetailedXML"] replaceObjectAtIndex:1 withObject:@"y"] ; 

사용 NSMutableArray의 배열로 캐스팅보십시오.

편집 :

NSMutableArray *xml = [[NSMutableArray alloc] init]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 
    [xml addObject:@"x"]; 

[defaults setObject:xml forKey:@"userLocationsDetailedXML"]; 
[xml release]; 

을 그런 다음을 변경 :

실제로 NSUserDefaults에 NSMutableArrays를 저장할 수 없습니다 감안할 때, 난 그냥 가서과 같이, 전체 일을 재 할당하는 것이 좋습니다 값은 documentation에서

NSMutableArray *userLoc = [[defaults objectForKey:@"userLocationsDetailedXML"] mutableCopy]; 
[userLoc replaceObjectAtIndex:1 withObject:@"y"]; 
[defaults setObject:userLoc forKey:@"userLocationsDetailedXML"]; 
[userLoc release]; //thanks, dreamlax! 
+0

안녕하세요 샘, 그게 도움이되지 못했습니다. 배열이 변경되지 않는다는 오류가 발생합니다. 그러나 woul'dnt [xml mutableCopy]는 가변 배열을 생성합니까? 이 경우 왜 불변입니까? – Veeru

+0

오, 그 다른 대답에 좋은 물건! 이 특정 문제를 처리하기 위해 NSUserDefaults를 사용할 수없는 것 같습니다. –

+0

이 작업을 더 잘 수행 할 수있는 방법에 대한 제안으로 내 대답을 편집했습니다. –

5

:

변경할 수있는 개체를 값으로 설정하더라도 NSUserDefaults에서 반환되는 값은 변경되지 않습니다. 예를 들어, "MyStringDefault"의 값으로 변경 가능한 문자열을 설정하면 나중에 stringForKey를 사용하여 검색하는 문자열이 변경되지 않습니다.

또한 오히려 추한 누출이 있습니다. 당신은 mutableCopy에 의해 반환 된 객체의 소유자이지만 객체에 대한 유일한 참조를 잃어 버렸기 때문에 소유권을 포기할 수 없습니다. xml 배열은 어쨌든 변경 가능합니다.

+0

흠, 흥미 롭군요, 내 애플 리케이션을위한 많은 로직 변경을 의미 할 것입니다 : ( 나는 그 정보를 주셔서 감사합니다 - 나는 솔루션을 찾을 수있는 해결책을 찾기 위해 머리를 부러 뜨 렸을 것입니다. :) – Veeru