[解決済み] Objective-C:idとvoidの違い*。
質問
とはどのような違いがあるのでしょうか?
id
と
void *
?
解決方法は?
void *
は、「型付けされていない/内容が不明な、ランダムなメモリチャンクへの参照」を意味します。
id
は、クラス不明のランダムなObjective-Cオブジェクトへの参照を意味します。
さらに意味上の違いもあります。
-
GC Only または GC Supported モードでは、コンパイラは、型
id
には適用されませんがvoid *
. 構造体を宣言する場合、この差は致命的なものになる可能性があります。 のようなiVarsの宣言はvoid *_superPrivateDoNotTouch;
の場合、オブジェクトの刈り取りが早まります。_superPrivateDoNotTouch
が実際にオブジェクトであることを示します。 そんなことはしないでください。 -
の参照に対してメソッドを呼び出そうとしている。
void *
という型があると、コンパイラの警告が出ます。 -
に対してメソッドを呼び出そうとすると
id
型のいずれでも宣言されていない場合にのみ警告されます。@interface
の宣言は、コンパイラが見ることができます。
従って、決してオブジェクトを
void *
. 同様に
id
型変数でオブジェクトを参照することができます。 できるだけ具体的なクラスの型付けされた参照を使用する。 例えば
NSObject *
よりも優れています。
id
なぜなら、少なくともコンパイラはその参照に対するメソッド呼び出しの検証をより良く行うことができるからです。
の一般的で有効な使い方は
void *
は、他の API を通して渡される不透明なデータ参照として使用されます。
を考えてみましょう。
sortedArrayUsingFunction: context:
のメソッドを使用します。
NSArray
:
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;
ソート関数は、次のように宣言される。
NSInteger mySortFunc(id left, id right, void *context) { ...; }
この場合、NSArrayは単にあなたが
context
としてメソッドの引数に渡します。
context
引数で指定します。 これは、NSArrayに関する限り、ポインタサイズのデータの不透明な塊であり、どのような目的にも自由に使用することができます。
クロージャ型の機能がない言語では、これが関数と一緒にデータの塊を持ち運ぶ唯一の方法です。 たとえば、mySortFunc() で大文字小文字を区別するかしないかを条件付きでソートし、かつスレッドセーフにしたい場合、コンテキストで is-case-sensitive インジケータを渡し、入りと出でキャストを行うことになるでしょう。
脆弱でエラーが起こりやすいですが、唯一の方法です。
ブロックはこれを解決する -- ブロックはCのクロージャであり、Clangで利用可能である --。 http://llvm.org/ で、Snow Leopardでは広く浸透しています ( http://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/GCD_libdispatch_Ref.pdf ).
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cの#importと#includeの違いは何ですか?
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] クラスメソッドとインスタンスメソッドの違いは何ですか?
-
[解決済み] objectForKeyとvalueForKeyの違い?
-
[解決済み】UITableViewControllerを使用しないUIRefreshControl
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] イニシャライザーの要素がコンパイル時定数でない
-
[解決済み] クラス 'test_coredataAppDelegate' の重複したインターフェイス宣言
-
[解決済み] .02fと%.2fの違いは何ですか?
-
[解決済み] Objective-Cのnil、NIL、nullの違いについて
-
[解決済み] iOS 8で位置情報サービスが利用できない
-
[解決済み] Xcode 4でNSZombieEnabledを設定するにはどうすればよいですか?
-
[解決済み] CocoaPodsを使用している場合、.gitignoreには何が入るのでしょうか?
-
[解決済み] Objective-CでNSArrayを逆引きするにはどうしたらいいですか?
-
[解決済み】Objective-C: パス文字列からファイル名を抽出する
-
[解決済み] Objective-CのNULLとnilの比較