15

これはどこにも見つからなかったので、確認してください。そして、はい、私はその基本を知っていますが、私が何百万回も間違いを犯す前に、私はむしろそれを正しく理解したいと思います:

次の場合、デフォルトで「0」をNSNumberにキャストしますか(そうでない場合は、どのオブジェクトタイプですか)、または2番目のコードを実行する必要がありますか?

(または、これらの両方が私がやろうとしていることに対して間違っている可能性があります。もしそうなら、私に知らせてください。両方ともコンパイルされるので、どちらが「正しい」(または好ましい)のか、そしてその理由は疑問です。)

コード1:

NSMutableArray array = [[[NSMutableArray alloc] init]];
[array addObject: 0];

コード2:

NSMutableArray array = [[NSMutableArray alloc] init];
[array addObject: [NSNumber numberWithInt: 0]];
4

3 に答える 3

23

NSMutableArray プリミティブ型を取りません

2番目のオプションは正しいです。

于 2012-05-07T17:40:43.737 に答える
8

のようなプリミティブをint;にNSArray入れることはできません。NSNumberインスタンスを作成して保持する必要があります。

次の場合、デフォルトで「0」をNSNumberにキャストしますか(そうでない場合は、どのオブジェクトタイプですか)。

キャスティングは行われません。プリミティブをオブジェクトに単純に「キャスト」することはできません。また、プリミティブにはオブジェクトタイプがありません。オブジェクトは、実行時に発生するメッセージ(以下を除く)を送信して構築する必要があります。キャストはコンパイル中にのみ効果があります。

0これが機能する唯一の理由は、アレイに追加することを選択したことです。nilこれは、 「オブジェクトなし」を表すと同じ値です。他の整数を選択した場合、値は有効なオブジェクトを保持していないメモリへのポインタとして使用されるため、コードを実行するとクラッシュする可能性があります。

ただし、興味深いことに、Clang3.1またはAppleのLLVM4.0 *以降、コード内のリテラルからオブジェクトを作成するための新しい構文上の砂糖がいくつかあります。私たちはいつも文字通り持っていましたNSStrings@"Lichtenstein"。新しいコンパイラでは、文字を使用して他のオブジェクトを同様に作成できます@

この場合、NSNumberリテラル整数からオブジェクトを作成するには、次のように記述します。

[array addObject:@0];

* (パブリックXcodeではまだ利用できません)

于 2012-05-07T17:46:06.603 に答える
0

id以前の返信で述べたように、オブジェクト(型)は。のようなコンテナクラスにのみ追加できますNSArray

このコンテキストで役立つ可能性のあるクラスの1つは、ですNSValue。これは、CおよびObjective-Cの非オブジェクトデータ型のコンテナーとして機能します。数値データ型に加えて、これには構造体や、などのObjective-Cプリミティブデータ型を含めることもできますNSRect

詳細については、こちらをご覧ください: https ://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html

于 2012-05-07T18:18:35.923 に答える