2009-07-17 9 views
0

あなたのためのiPhoneの質問!私はサーバーからXMLをダウンロードし、それを別の配列の一部である配列に処理するNSURLConnectionを持っています。私は必要なオブジェクトの数を知る方法がないので、事前にNSArrayを割り当てることはできません。私の質問は:View Controllerにクラスオブジェクトの配列の配列を格納する必要があります

NSArrayクラスのレベルで親配列を作成し、私は一時的なNSMutableArrayにデータを格納した後に割り当てるか、単にNSMutableArrayをクラスレベルで作成する方がいいですか?プログラムの実行終了時に配列を解放する以外に、配列を変更する必要はありません。

答えて

1

私は本当に重要ではないと思います。 あなたがNSArrayのプロパティを持っていると思います:

私は、現時点で始まりiPhone 3開発本を読んで、通常はデータをロードしていますが、このように行われ

@interface 
{ 
... 
    NSArray *listOfObjects; 
... 
} 
@property (nonatomic, retain) NSArray *listObObjects; 
... 

その後、あなたはNSMutableArrayのを作成し、あなたのデータをロードし、プロパティを設定します。

NSMutableArray *array = [[NSMutableArray alloc] init]; // ? 
// load the XML into array here 
... 
self.listOfObjects = array; 
[array release]; 

listOfObjectsそれは実際にNSMutableArrayのだろうが、その後にNSArray(不変)として扱われます。

0

XMLで表現しているものと一致するいくつかのクラスを作成することをお勧めします。たとえば、xmlが次のようになっているとします。

<peopleList> 
    <person> 
    <name>Joe</name> 
    <possession>Shovel</possession> 
    </person> 
    <person> 
    <name>Sam</name> 
    <possession>Shovel</possession> 
    <possession>Fork</possession> 
    <possession>Backpack</possession> 
    </person> 
</peopleList> 

PeopleListクラスとPersonクラスが必要です。 PeopleListクラスからインスタンス化されたオブジェクトには、1つ以上のPersonオブジェクトを含む最初の配列があります。また、Personオブジェクトにはpossesionsを保持する配列もあります(この場合は文字列ですが、必要に応じてPossesionオブジェクトにすることもできます)。この場合、Personクラスには別のプロパティもあります: 'name'これも文字列です。例えば

:あなたは、彼らがオブジェクトを受信できるようになりますので、配列のinit/ALLOCする必要がありますこれらのオブジェクトのinitメソッドの中

@interface PeopleList { 
    NSMutableArray *persons; // An array to store the Person objects 
} 
@property (nonatomic, retain) NSMutableArray *persons;  
@end 



@interface Person { 
    NSString *name; 
    NSMutableArray *possesions; //An array to store this Person's possesion strings 
} 
@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSMutableArray *possesions; 
@end 

。私はそれらをalloc'dするので、私のクラスは、リリースを担当しています。

@implementation PeopleList 
    -(id) init { 
     if (self = [super init]) { 
      persons = [[NSMutableArray alloc] init]; 
     } 
    } 

    -(void) dealloc { 
     [persons release]; 
     [super dealloc]; 
    } 
@end 


@implementation PeopleList 
    -(id) init { 
     if (self = [super init]) { 
      possesions = [[NSMutableArray alloc] init]; 
     } 
    } 

    -(void) dealloc { 
     [possesions release]; 
     [super dealloc]; 
    } 
@end 

これで、カスケード配列のデータ構造を設定できます。 あなたが人物データベースタグに遭遇したときにXMLを解析するようにしてください:

currentPerson = [[Person alloc] init]; 
[peopleList.persons addObject: person]; 

ポゼッション:

currentPeopleList = [[PeopleList alloc] init]; 

、あなたは人の田下に遭遇行う

[currentPerson.possesion addObject: contentsOfCurrentElement]; 

または名前:

currentPerson.name = contentsOfCurrentElement; 

しかしあなたのより具体的な質問に答えるために、私は一時的なNSArrayにデータを格納せず、それをNSMutableArrayにコピーします。そうすることでパフォーマンスはほとんど向上せず、CPUのサイクルとメモリを消費してコピーを作成します。

関連する問題