このマクロを使用して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
繰り返しますが、問題の変数はメソッドの引数です。問題がわかりません。マクロを保持するにはどうすればよいですか?