2

NSMutableArrayを呼び出しaddObject:ても、その配列のセッターにアクセスできないことに気づきました。

たとえば、NSMutableArrayself.myArrayの場合、オブジェクトの追加に[self.myArray addObject:object]は使用しません。[self setMyArray:array]

以前は、カスタムセッターとゲッターを使用して、割り当てる前に割り当てを確認していました。たとえば、クラスのオブジェクトのみを受け入れる配列が必要な場合MyClassは、次のようにします。

- (void)setMyArray:(NSMutableArray *)myArray
{
    for (id object in myArray)
    {
        if (![object isKindOfClass:[MyClass class]]) return;
    }
    _myArray = myArray;
}

- (NSMutableArray *)myArray
{
    if (!_myArray) _myArray = [[NSMutableArray alloc] init];
    _myArray = myArray;
}

、、およびセッターを回避する可能性のある他の同様の関数を介しaddObject:て配列を変更するときに、これと同じ機能を実現するにはどうすればよいですか?removeObject:

4

2 に答える 2

3

NSMutableArray一般に、この種の問題は、が優先して回避される理由ですNSArray

これは簡単な解決策です。NSMutableArray の代わりに NSArray を使用します。

self.myArray = [self.myArray arrayByAddingObject:foo];

ただし、配列が非常に大きい場合は、パフォーマンスの問題が発生します。次に、2 つのオプションがあります。

  • クラスに独自のaddObjectToMyArray:メソッドを持ち、常にそれを使用できます
  • を作成し、NSArrayControllerそれを使用して配列にアクセスできます。キー値の監視とバインディング、およびそのすべてを実装します。

NSMutableArrayaddObject:可能な限り少ない CPU 命令で実行するように設計されているため、オブジェクトが追加されたことを外部コードに通知する方法は証明されていません。他のクラスをラップする必要があります。

をサブクラス化しようとしないでくださいNSMutableArray。これは、サブクラスを非常に複雑にする「クラス クラスター」であるためです。

于 2012-11-29T21:32:37.597 に答える
0

配列内のオブジェクトが特定のクラスであることを確認したい場合は、「NSMutableArray - 配列に特定のオブジェクト タイプのみを強制的に保持する」という質問に対するこの回答で、まさにそれを行うコードが提供されます。

割り当て時に他のチェックを行いたい場合は、その回答のコードを出発点として使用できます。

于 2012-11-30T09:57:19.150 に答える