2009-05-09 11 views
7

上記のNSArrayの簡易メソッドを使用してNSMutableArrayを初期化すると、NSArrayまたはNSMutableArrayを取得できますか?NSMutableArrayを初期化します。[NSMutableArray array];

(私はちょうど興味:, NSMutableArrayのは」arrayWithCapacityを持っていることを知っている)

+1

以下の興味深い議論を簡単な質問に感謝します。これは、微妙なココアポイントをいくつか負うことになります。 –

答えて

11

あなたが使用して初期化した場合:

NSMutableArray *array = [NSMutableArray array]; 

をあなたはNSMutableArrayのを取得するのObjective-Cの一つの大きな特徴があります。そのクラスのメソッドはサブクラスに継承され

ので、クラスメソッドでは、あなたがこのような何か行うことができます。

+(id)array { 
    return [[[self alloc] init] autorelease]; 
} 

およびselfは、コードが実行されているクラスオブジェクト(NSArrayまたはNSMutableArray)を参照します。

+0

ああ、興味深い。したがって、自己はClass Object:NSMutableArrayを参照します。それは理にかなっている。なぜ私のコードが壊れていないのか疑問に思った! –

+1

私はあなたが実際に行うと思います:return [[[self alloc] init] autorelease]; –

+0

そうです、サンプルコードを変更します。 – pgb

4

更新:「自分でテストする」という私のアドバイスは、一般的には良いアイデアですが、このケースでは少し喜んでいました。 NSArrayの様々なフォームはすべてCoreFoundationのフリーダイヤル・ブリッジング・クラスによって実装されているため、Jimのコメントで、以下の提案はこれらのクラスではうまくいきません。

----- -----

以下コンテキストのオリジナル回答は、このような質問に答えるための最も簡単な方法は、それを自分でテストすることです。好奇心をそそる方法で配列を割り当て、次にコードからNSLogを割り当ててみてください。

NSLog(@ "NSStringFromClass([theArrayクラス]));

+1

それは常に 'NSCFArray'を返すでしょうか? –

+0

大きなポイント、ジム。私はNSArrayのその特異性を忘れていました。上記の私の回答を編集する。ありがとう。 – danielpunkass

+0

Hmmmが交差しています。だからNSMutableArrayでさえNSCFArrayを吐き出すだろうか?そのため、イントロスペクションを実行したり、変更する前に変更可能なオブジェクトがあるかどうかを調べることが難しくなります。その場合、あなたはrespondsToSelectorを行うことができると思います。 あなたのすばらしいポッドキャストに感謝します。私は戻って、あなたとマントンの過去のエピソードのほとんどを聞いてきました。かなり面白いと有益。 –

関連する問題