0

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

親配列をクラス レベルで NSArray として作成し、データを一時的な NSMutableArray に格納した後に割り当てるか、単にクラス レベルで NSMutableArray を作成する方がよいでしょうか? プログラムの実行の最後に配列を解放する以外に、配列を変更する必要がないことは注目に値します。

4

2 に答える 2

1

私はそれが本当に重要だとは思わない。

私は現在 Beginning iPhone 3 Development の本を読んでおり、通常、データのロードは次のように行われます: NSArray プロパティがあるでしょう:

@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 (不変) として扱われます。

于 2009-07-17T02:59:13.723 に答える
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オブジェクトには、所有権を保持する配列もあります(この場合、文字列ですが、必要に応じてPossesionオブジェクトにすることもできます)。この場合、例を支援するために、Personクラスにも別のプロパティがあります。これも文字列です。

例えば:

@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

これらのオブジェクトのinitメソッドでは、オブジェクトを受け取る準備ができるように、配列を割り当て/初期化する必要があります。そして、私がそれらを割り当てたので、私のクラスがリリースに責任があります。

@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

これが完了したので、カスケード配列のデータ構造を設定できます。PeopleListタグに出くわしたときにXMLを解析しているときに、次のことを行います。

currentPeopleList = [[PeopleList alloc] init];

そして、Person tageに出くわしたときは、次のことを行います。

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

所持:

[currentPerson.possesion addObject: contentsOfCurrentElement];

または名前:

currentPerson.name = contentsOfCurrentElement;

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

于 2009-07-17T05:49:45.187 に答える