0

私は何かと戦っていますが、満足のいく解決策は見つかりません。

「myMutableArray」メンバーを持つクラスがあります。

クラスが配列のアイテムの追加と削除を自分で管理するようにしたいので、他のクラスがメンバーにアクセスしてそのメンバーでNSMutableArrayメソッドを呼び出せないようにします。

理想的な状況では、このメンバーのプライベートゲッター(self.myMutableArrayを呼び出せるようにするため)とパブリックセッターが必要です。

私がこれをどのように達成できるか知っていますか?

言い換えると :

他のクラスが欲しい

電話できる

- [oneInstance setMyMutableArray:thisArray]; // set
- oneInstance.myMutableArray = thisArray; // set using setter

- thisArray = oneInstance.myMutableArray; // get
- [oneInstance addItem:anItem]; // add

電話できない:

- [oneInstance.myMutableArray add:etc...] // add

クラスをお願いします

電話できる

- self.myMytableArray = [NSMutableArray array]; // set
- thisArray = self.myMytableArray ; // get

ありがとうございました。

4

2 に答える 2

1

パブリックセッターが必要な理由はありますか?クラス自体が配列を所有しているようです。フィールドへのパブリックプロパティアクセスを提供せず、値をプライベートフィールドにコピーするパブリックメソッドを作成する方がおそらく良いでしょう。

// public interface, in the .h file
@interface MyClass : // superclass, protocols, etc.
- (void) setSomething:(NSArray *)values;
@end

// private interface, not in the .h
@interface MyClass ()
@property (/* attributes */) NSMutableArray *myMutableArray;
@end

@implementation MyClass
@synthesize myMutableArray = myMutableArray_;

- (void) setSomething:(NSArray *)values
{
    [self.myMutableArray setArray:values];
}

@end
于 2010-12-30T14:27:09.303 に答える
0

Foo.h

@interface Foo : NSObject
@property(readonly, retain) NSArray * myReadonlyArray;
- (void) addItem: (Item *) anItem;
- (BOOL) publiclyDoSomething;
@end

Foo.m

@interface Foo()
@property(readwrite, retain) NSMutableArray * myMutableArray;
- (void) doSomethingInPrivate;
@end

@implementation Foo
@synthesize myMutableArray = myMutableArray_;

- (void) addItem: (Item *) anItem
{
    // assuming myMutableArray_ was already iniitialized
    [self.myMutableArray addObject: anItem];
}

- (NSArray *)myReadonlyArray
{
     return self.myMutableArray;
}

... rest of methods (including the public/private) implementations ...
@end

いくつかの詳細:

  • Objective-Cには、「メンバー変数」ではなく「インスタンス変数」があります。

  • 上記は、自動的に合成されるパブリックゲッターとプライベートセッターを定義します。わかりやすくするために、パブリックメソッドとプライベートメソッドも追加しました。

  • Objective-Cの「パブリック」と「プライベート」は、コンパイラへの可視性によって完全に定義されます。のセッターmyMutableArrayとメソッドは、の宣言をインポートできないdoSomethingInPrivateため、プライベートのみです。@interface

  • self.myMutableArray[self myMutableArray]同じことをします。構文は、.同等のメソッド呼び出しの省略形にすぎません(この質問以外のいくつかのエッジケースの詳細があります)

  • @propertyは、@interfaceメソッド宣言の純粋な省略形です(少し余分なメタデータがあります)。

  • @interface Foo()クラス拡張であり、カテゴリではありません。これは、上記で示した目的のために存在します。@interfaceスコープを制限する必要がある追加の宣言情報を使用してクラスのを拡張します。たとえば、ライブラリの実装にインポートしてライブラリプライベート機能を作成するだけのヘッダーファイルに表示される場合があります。

  • @dynamic従来のメソッド実装 @synthesize提供もしない場合に使用されます。それ以外は必要ありません!@property

私はおそらく何かを忘れています。

于 2010-12-30T18:01:47.417 に答える