1

これは完全なNoobの質問だと確信しています...しかし、実際にはこれまでこのシナリオに対処する必要がなかったので、少し困惑しています...

たとえば、personと呼ぶカスタムオブジェクトがあり、各personオブジェクトには、必要に応じて一種のインベントリである「所有物」の配列を含めることができます。私はそれを次のように設定します:

interface person : NSObject {
    NSString *name;
    NSMutableArray *posessions;

@property (copy) NSString *name;
@property (copy) NSMutableArray *posessions; // no idea if this is even necessary...

}

もちろん、実装ファイルでプロパティを合成することもできます...ここで、実際のコントローラーオブジェクトで、オブジェクトのインスタンス(または通常はインスタンスの配列ですが、この例では正常に機能します)を作成します。 ..)そのように:

person *aPerson;

人の名前にアクセスするには、次のように電話をかけることができます。

[aPerson setName:@"Bob"];

その名前を取得するには、次のように使用します。

aVar = [aPerson name];

私が立ち往生しているのは、personクラス内にあるNSMutableArrayにオブジェクトを追加または取得する方法を正確にどのようにするかです。NSMutable配列に「count」メソッドを使用したいとします。

私は次のような試みでいくつかの試行錯誤をしました:

[aPerson.posessions count];
[[aPerson posessions] count];

同様に、オブジェクトを配列に追加するために、私はよく使用しました:

[someArray addObject:anObject];

しかし、このような試みはうまくいきませんでした:

[aPerson.posessions addObject:anObject];

たくさん読んでWebを検索した後、カスタムクラスでこのNSMutableArrayを操作する方法を正確に見つけることができないようです。私が完全に得ていないことは明らかなことだと確信しています、そしてそれは一種の精神的なブロックになっています...

また、NSMutableArrayのアクセサープロパティの合成は正しいですか?もしそうなら、setXとXはNSMutableArrayではそれほど明白ではないようです...それらが単に配列全体をローカル変数にコピーしない限り...

おそらくこれは何をする必要があるのでしょうか?アクセサメソッドを使用して配列全体を取得し、それをローカル変数に配置して変更を加えてから、setアクセサメソッドを使用して配列全体をpersonオブジェクトに戻しますか?

誰かが私がここで使用すべき構文について少し教えてもらえますか?

* 編集 *

この質問に少し説明を加えたいと思いました。私のカスタムオブジェクト(上記の例では、私のpersonオブジェクト)は基本的にデータベースレコードです。プロジェクトで使用しているデータベースがいくつかあるので、たとえば次のようにします。

Person-複数のNSStringオブジェクト、およびIntとBOOLを含むNSObjectのカスタムサブクラス。

personDatabase-Personオブジェクトの配列(メインのCONTROLLERオブジェクト内で設定および制御されます)

setメソッドとgetメソッドはすべて、「Controller」から呼び出されます。

私がやろうとしているのは、コントローラーオブジェクト内からpersonDatabase内に含まれる個々のオブジェクトに直接アクセスすることです。私はこのように別のオブジェクトを宣言することによってこれを行いました:

Person *activePerson;

次に、次のように、現在アクティブなPersonレコード(personDatabaseから現在選択されているレコード)に対してすべての呼び出しが行われます。

someOutput = [activePerson name];

ControllerオブジェクトからactivePersonオブジェクト内のNSMutableArrayオブジェクト内のオブジェクトに直接アクセスする方法はありますか?

4

1 に答える 1

2

'possessions'プロパティを'copy'として指定しました。したがって、あなたが書くとき、あなたaPerson.possessionsは所有物配列のコピーを手に入れています。addObjectを呼び出すと、aPersonの所有物の配列のコピーである新しい配列にanObjectが追加されます。最も簡単な「修正」は、「コピー」を「保持」(そしておそらく「読み取り専用」)に変更することです。 [編集:間違った; それは'割り当て時にコピー'-'読み取り時にコピー'ではありません]

ただし、より大きな問題があります。人は所有物を持っていますが、それらをどのように保存するかは実装の詳細です。NSMutableArrayをパブリックインターフェイスに配置すると、実装が過度に制限されます。次のようにPersonインターフェイスを変更する方がよい場合があります。

@interface Person : NSObject {
@private
     NSString *name;
     // ...
  }
  - (Boolean) addPossession: (NSObject *) obj;
  - (Boolean) remPossession: (NSObject *) obj;
  - (Boolean) hasPossession: (NSObject *) obj;
  - (NSArray *) allPossessions;
@end

次に、これらの所有メソッドを実装する方法は、配列、セット、リンクリスト、ツリーなどを使用するかどうかによって異なります。

于 2012-06-01T22:53:18.810 に答える