Cocoa 속성 목록에 문자열을 배열로 저장하려면 어떻게 해야 합니까?
-
13-09-2019 - |
문제
두 개의 문자열을 저장하려고합니다.한 문자열은 pList에 ARRAY 유형으로 저장되어야 하고 두 번째 문자열은 Array에 문자열로 저장되어야 합니다.
다음 코드를 사용할 수 있습니다.
[사전 setObject:(id)anObject forKey:(id)aKey>]
하지만 제대로 저장되지는 않습니다.문자열 중 하나를 배열로 캐스팅할 수 있지만 여전히 제대로 작동하지 않습니다.
배열을 pList에 저장하는 적절한 방법은 무엇입니까?
내 pList는 다음과 같습니다.
<dict>
<key>Test One</key>
<array>
<string>A13#</string>
</array>
<key>Another Test</key>
<array>
<string>1111111111</string>
</array>
<key>Test Three</key>
<array>
<string>2222222222</string>
</array>
<key>Final Test</key>
<array>
<string>3333333333</string>
</array>
</dict>
여기에 내가 사용하는 방법이 있습니다.
-(void)writeToFile:(NSString *)s1{
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"saved" ofType:@"plist"];
NSMutableDictionary *dictionary = [[[NSDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
NSString *tempString = [NSString stringWithFormat:@"1234567"];
[dictionary setObject:tempString forKey:s1];
[dictionary writeToFile:plistPath atomically:YES];
}
해결책
문자열을 배열로 변환하거나 변환할 수 없습니다.그것들은 별개의 별개의 개체입니다.이는 실생활에서 개를 스테이션 왜건으로 바꾸려고 시도했지만 일어나지 않는 것과 같습니다.
대신에 개를 스테이션 왜건 안에 넣으세요(또는 줄을 배열 안에 넣으세요).다음을 사용하여 배열을 만들 수 있습니다. [NSArray arrayWithObjects:@"string1", @"string2", nil];
.다른 키에 대한 최종 문자열과 함께 특정 키에 대한 사전 내부에 이를 추가하고 저장하면 하나 이상의 문자열 배열이 포함된 plist가 생성됩니다.
또한 코드 예제에서 사전에 메모리가 누수되고 있습니다.Objective-C의 메모리 관리에 대해 읽어보세요. 제대로 이해하기 전까지는 수많은 충돌과 성능 문제에 직면하게 될 것입니다.
다른 팁
문자열을 단일 요소 배열로 변환합니다.
[NSArray arrayWithObject:str];
따라서 PLIST가 문자열 배열로 항목을 포함시키고 원소로 단일 문자열을 원한다면 다음과 같은 작업을 수행합니다.
[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];
나는 당신이 다른 시간에 키 당 여러 줄을 허용하지 않는 한 왜 이런 식으로 그것을 원할 이유가 아닙니다.
또한 Marc가 언급했듯이, 당신은 당신이 만든 초기 (무의미한) 사망을 유출하고 있습니다. 메모리 관리 규칙을 읽으십시오 http://developer.apple.com/documentation/cocoa/conceptual/memorymgmt/articles/mmrules.html.
또한 애플리케이션의 번들 내부에 쓰지 않아야합니다. 우선, 응용 프로그램은 쓰기 보호 볼륨에있을 수 있거나 현재 사용자는 변경할 권한이 없을 수 있습니다. 다른 사람의 경우 파일은 모든 사용자가 공유합니다. 그리고 세 번째로, 그것은 코드 서명을 깨뜨릴 것입니다. 대신 파일을 환경 설정 폴더 또는 응용 프로그램 지원 폴더에 쓰십시오.
마지막으로, 이것들이 어떤 종류의 사용자 선호도 인 경우, 기본 설정 시스템을 사용해야합니다.이 시스템은 기본값을 구성하고 기본 설정 폴더에 기본 설정을 저장할 수 있습니다. 보다 http://developer.apple.com/documentation/cocoa/conceptual/userdefaults/userdefaults.html 자세한 내용은.
저장하는 올바른 방법 NSARRAY (그 자체로) plist 파일에 대한 것과 같습니다.
NSArray* anArray = ...;
[anArray writeToFile:@"/path/to/file.plist" atomically:YES];
그러나 NSString을 배열로 저장할 수는 없습니다. 제공 한 XML Plist가 주어지면 동일한 형식의 항목을 추가하려면이 훨씬 간단한 코드를 사용할 수 있습니다.
- (void) writeToFile:(NSString *)string {
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"saved" ofType:@"plist"];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
[dictionary setObject:[NSArray arrayWithObject:@"1234567"] forKey:string];
[dictionary writeToFile:plistPath atomically:YES];
}
이것은 또한 수신자가 -mutableCopy
1의 보유 수로 탈출합니다 (GC에서는 문제가되지 않지만 여전히 나쁜 연습입니다.) 사용할 필요는 없습니다. +[NSString stringWithFormat:]
, 문자열 문자 그대로 사용하십시오. 배열의 문자열로 다른 것을 사용하려면 추가 매개 변수로 전달하고 다른 방법에서 가져올 수 있습니다.
이 메소드는 주어진 키와 일치하는 배열에 하나의 문자열 만 저장한다는 점에서 여전히 부서지기 쉽습니다. 또한 메소드 이름이 정확히 무엇을하는지를 더 잘 나타내는 경우 더 나을 것입니다. 또한 각 키에 대해 하나의 문자열 값 만있는 경우 공간을 씹고 코드를 복잡하게하기 때문에 배열을 완전히 생략하기 위해 PLIST를 수정하는 것을 고려할 수 있습니다.