1

このマクロを使用してNSError**引数を初期化することに慣れています。

#define INIT_ERROR_IF_NULL(error) error = error ? error : &(NSError*){ nil }

NSError**これは渡された引数をチェックし、それが の場合NULLはダミーに初期化して、すべての逆参照を条件付きでNSErrorラップする必要がないようにします。*errorコードでは、このバージョン:

- (void) doFoo: (NSError**) error
{
    if (error) {
        *error = [NSError …];
    }
}

…次のようになります。

- (void) doFoo: (NSError**) error
{
    INIT_ERROR_IF_NULL(error);
    *error = [NSError …];
}

私はこのアプローチが気に入っています。これにより、分岐が節約され、コードの記述が少なくなります (もちろん、errorが一度だけ使用される場合は気にしません)。問題は、コンパイラがポインター型の不一致について不平を言うため、最近の Clang バージョンで動作しなくなったことです。

Pointer type mismatch ('NSError *__autoreleasing *' and 'NSError **')

結果の匿名オブジェクトを明示的にキャストするようにマクロを変更するとNSError *__autoreleasing*(型シグネチャがばかげています)、コンパイラは別の行でさらに文句を言います。

Casting 'NSError **' to type 'NSError *__autoreleasing *' changes retain/release properties of pointer

繰り返しますが、問題の変数はメソッドの引数です。問題がわかりません。マクロを保持するにはどうすればよいですか?

4

1 に答える 1

2

これはエラー/警告なしでコンパイルされます:

#define INIT_ERROR_IF_NULL(error) error = error ? error : &( NSError __autoreleasing *){ nil }
于 2013-02-08T07:52:44.723 に答える