2009-07-13 5 views
0

여기에 답변으로 제안 된대로 plist에서 배열을 가져 오려고하지만 작동하지 않습니다. 누군가 내가 놓친 걸 말해 줄 수 있니?iPhone plist의 배열

plist는 다음과 같습니다. 또 다른 이상한 점은 일반 텍스트 파일에서 열 수 없다는 것입니다. 내가 할 때 쓰레기처럼 보인다 .....하지만 속성 목록 편집기에서 잘 보이는 : 여기

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>count</key> 
<array> 
    <integer>5</integer> 
</array> 
<key>username</key> 
<array> 
    <string>johnsmith</string> 
</array> 
</dict> 
</plist> 

내가 사용하고 코드입니다 ..... 사전은 NSMUtableDictionary하고 accountsArray은이다 .h 파일에있는 NSMustableArray.

 NSMutableDictionary *tempDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath]; 

dictionary = tempDictionary; 
[tempDictionary release]; 


NSMutableArray *nameArray = [[NSMutableArray alloc] init]; 
nameArray = [dictionary objectForKey:@"username"]; 

accountsArray = nameArray; 

[nameArray release]; 

내가 누락 된 것이 있습니까? 뭔가 망치고있어?

감사합니다 ...

답변

0

는 :

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];  


if (accountsArray == nil){ 

    accountsArray = [[NSMutableArray alloc]init]; 
} 

if (countArray == nil){ 

    countArray = [[NSMutableArray alloc]init]; 
} 



countArray = [dictionary objectForKey:@"count"]; 
accountsArray = [dictionary objectForKey:@"username"]; 
+0

실제로 I이 사용했을 \t 경우 (accountsArray == 무기 호) { \t \t \t \t accountsArray = [[[있는 NSMutableArray의 ALLOC] INIT] 오토 릴리즈]; \t} \t \t 경우 (countArray == 닐) { \t \t \t \t countArray = [[[있는 NSMutableArray의 ALLOC] INIT] 오토 릴리즈]; \t} – Xcoder

+0

-1. 이러지 마. 이 코드는 모든 관점에서 잘못되었습니다. – shader

+0

코드에 어떤 문제가 있습니까? – icant

5

음, 많은 문제가 있습니다. 먼저 plist는 아마도 XML 속성 목록이 아닌 이진 속성 목록 일 것입니다. 이것은 코드 측면에서별로 중요하지 않지만 개방으로 문제를 일반 텍스트로 설명해야합니다.

둘째, tempDictionary을 릴리스하여 두 개체가 같은 개체를 가리 키므로 dictionary도 릴리스합니다. 이렇게하면 코드가 작동하지 않는 이유를 설명 할 수 있습니다. autorelease을 시도하거나 간단히 dictionaryWithContentsOfFile:을 입력하고 릴리스 문구를 모두 입력하십시오. (dictionaryWithContentsOfFile:은 반환 값을 자동으로 반환합니다.)

두 번째 구문에서도 릴리스 실수를 반복합니다. 대입 연산자 (=)는 Objective-C에서 복사하지 않습니다. 그것 를 지정합니다.

편집 : 속성 표기법을 사용할 때 후자는 사실이 아닙니다. 특성이 정의된다고 가정. self.accountsArray = nameArray (아마도) 배열을 객체에 복사합니다.

재 편집 : 올바른 코드 : 나는 결국이 같은 작업있어

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath]; 
accountsArray = [dictionary objectForKey:@"username"]; 
+0

내가 지금이 일을하고 있는데 지금은 충돌하고 있습니다 .... \t 사전 = [NSMutableDictionary dictionaryWithContentsOfFile : accountsFilePath]; \t \t 경우 (accountsArray == 닐) { \t \t \t \t accountsArray = [있는 NSMutableArray의 ALLOC] INIT]; \t} \t \t \t 있는 NSMutableArray nameArray * = [있는 NSMutableArray의 ALLOC] INIT]; \t nameArray = [사전 objectForKey : @ "사용자 이름"]; \t \t \t accountsArray = nameArray; \t \t [nameArray release]; – Xcoder