8

このコードでは

id (^block)(void) = ^(void) {
    return nil;
};

このエラーがあります

タイプ「void *(^)(void)」の式で「id (^__strong)(void)」を初期化する互換性のないブロック ポインター タイプ

したがって、明示的に型にキャストnilする必要がありますid

id (^block)(void) = ^(void) {
    return (id)nil;
};

コンパイラを幸せにするために。なぜ購入しnilないidタイプですか?

そして、このコードについて

__typeof__(nil) dummy;
dummy = [NSObject new];

Objective-C ポインター型 'NSObject *' から C ポインター型 'typeof (((void *)0))' (別名 'void *') への暗黙的な変換には、ブリッジ キャストが必要です。

と言っているnilのですが(void *)0、と同じではありませんNULLか?私はあるnilべきで(id)0あり、Nilあるべき(Class)0ですか?

Xcode 4.6.2 を使用しています

コンパイラ: Apple LLVM バージョン 4.2 (clang-425.0.28) (LLVM 3.2svn ベース)

4

3 に答える 3

3

ブロック リテラルに推論された戻り値の型を使用していますが、そうする必要はありません。

そのエラーを取り除く正しい方法は、ブロック リテラルの戻り値の型を提供することです。

id (^block)(void) = ^id{
    return nil;
};
于 2013-06-15T23:15:02.887 に答える
0

Appleヘッダーにnilが含ま#define nil NULLれている理由はわかりません(これは事実ですが、期待どおりではない理由はわかりません(id)0)が、Xcodeの最新バージョンで言及されているエラーは発生しませんでした。コンパイラ。

ブロックの戻り値の型などで、そのような暗黙のキャストを誤って解釈した以前のバージョンのレガシー コンパイラのバグを覚えていると思います。

どのコンパイラを使用していますか? LLVM-GCC 4.2? または Apple LLVM 4.2 ? 古いコンパイラ ? プロジェクトのビルド設定を確認してください。Apple LLVM に切り替えて、問題が解決するかどうかを確認することをお勧めします。

(実際のところ、LLVM-GCC は、Xcode の一部のバージョン以降、古い GCC から新しい LLVM への移行にのみ使用されますが、非推奨であり、Xcode の次のバージョンで削除される予定です)

于 2013-06-15T11:14:42.163 に答える