私が正しく理解していれば、 void *を「C の保持可能なポインター型」として分類できます。 したがって、それを Objective-C オブジェクトに割り当てると、暗黙的にブリッジされます。ただし、コンパイラは、明示的なブリッジングが必要であるというエラーを発生させます。
const void * somePtr = (void *)0x12345678;
- (void)someMethod:(id)sender
{
NSObject *obj = (NSObject *)somePtr;
}
また、null ポインター定数をチェックしたところ、明示的なブリッジなしでコンパイルされました。
NSObject *obj = (void *)0;
XCode 4.5(Clang 4.1 (tags/ Apple/clang-421.11.66 ) ( LLVM 3.1svnに基づく)) を使用しています。
質問: NSObject に任意の/無関係なポインターを割り当てるのは少し奇妙ですが、ルールを正しく理解しているかどうかを確認したいと思います。「Cの保持可能なポインタ型」について少し疑問があります。説明; 特に (おそらく修飾された)と(おそらく修飾された)の意図について。「C保持可能ポインター型」として分類できるポインター型は何ですか?
また、 「システムグローバル変数」ステートメントによって、実際にはシステムからのグローバル変数を意味しますか?
3.3.2. 既知のセマンティクスを持つ式の保持可能なオブジェクト ポインター型への変換 [Apple 4.0、LLVM 3.1 以降]
次の場合、式は保持に依存しないことが知られています。
- Objective-C 文字列リテラル、
- C の保持可能なポインタ型の const システム グローバル変数からのロード、
- または null ポインター定数。
キャスト オペランドが既知の unretained または既知の keep-agnosticである場合、変換は__bridge キャストとして扱われます。
7.8. C の保持可能なポインター型
型が (修飾されている可能性がある) void へのポインターであるか、(修飾子である可能性がある)構造体またはクラス型へのポインターである場合、その型は C の保持可能なポインター型です。