2011-12-30 2 views
4

NSMutableオブジェクトの配列を含むモデルクラスがあります。コントローラクラスはこの配列にアクセスする必要がありますが、アクセスは読み取り専用にする必要があります。メソッドから戻り値の型としてNSArrayとしてNSMutableArrayを公開する方法

これはどのように実装する必要がありますか?モデルが(読み込み専用)NSMutable配列として配列を公開し、constを使用するか、それをNSArrayとして公開する必要がありますか?後者の場合、NSArrayをNSMutableArrayから効率的に作成するにはどうすればいいですか?つまり、NSArrayにNSMutableArray/(NSMutableArrayは、コントローラがコントローラにアクセスしている間、メモリ内に保持されることが保証されています)。

答えて

11

あなたは直接あなたのNSMutableArrayを返すことができます。

- (NSArray *)method 
{ 
    return myMutableArray; 
} 

NSMutableArrayNSArrayのサブクラスなので、コントローラはすでにそれにNSArrayすべての操作を行うことができるようになります。あなたが誰かがあなたにトリックを引くしようとしているかもしれないことを本当に心配している場合は、使用できます。

return [NSArray arrayWithArray:myMutableArray]; 

は不変コピーを返すように。

+0

+1 - ドットアクセサの構文を使用するとパフォーマンスが低下することにご注意ください。 – matm

1

NSMutableArrayはNSArrayを継承しているため、NSMutableArrayをNSArrayとして公開する(おそらく暗黙的に)以外はNSMutableArrayを公開することはありません。それはまだ同じオブジェクトであることに注意してください。誰かが巧みになりたいのであれば、それをダウンキャストしたり、NSMutableArrayメソッドを呼び出すことさえできます。

2

読み取り専用のNSMutableArrayはありません。プロパティを読み取り専用として定義すると返されるオブジェクトが不変になると考えている場合は、そうではありません。

タイプにNSArrayの読み取り専用プロパティを公開し、次のようにアクセサに新しい配列を返す:

return [NSArray arrayWithArray:mutableArray]; 

注変更可能な場合は、配列内のオブジェクトは、まだ変更になること。

0

これは過度の可能性がありますが、配列の@private ivarを持つ独自のカスタムクラスを作成し、データのみにアクセスするための読み取り専用のプロパティ/メソッドを作成できます。

すなわち(実装スニペット):

@interface CustomArray : NSObject 
{ 
    @private 
    NSArray *array; 
} 

@end 

- (id)initWithNSArray:(NSMutableArray *)array; 

- (id)getObjectAtIndex:(int)index; 

@implementation 

// implement methods here 

@end 
2

あなたの可変配列を渡し続けたいが、他の方法は、既存のアレイを上書きしないようにしたい場合、あなたは常にコピーを渡すことができ

return [myMutableArray copy]; 

このようにして、(NSMutableArrayはサブクラスなので)NSArray型を返し、myMutableArray自体が改ざんされていないことを確認します。