문제

두 개의 문자열을 저장하려고합니다.한 문자열은 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를 수정하는 것을 고려할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top