未使用の変数警告が発生する理由を正確に理解しています。それらはほとんどの場合非常に有用であるため、一般的にそれらを抑制したくありません。ただし、次の(工夫された)コードを検討してください。
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
Xcodeはsaved
が未使用の変数であることを報告しますが、もちろんそうではありません。これはNSAssert1
はマクロです。 NS_BLOCK_ASSERTIONS
マクロはnotで定義されているため、Objective Cアサーションは確実に有効になります。
それは何も害はありませんが、私はそれを乱雑で迷惑だと感じ、それを抑制したいのですが、どうすればいいのかわかりません。変数をそれ自体に割り当てると、コンパイラの警告がなくなりますが、そのようなものが存在する場合は、「正しい」方法でそれを行います。
新しいLLVMコンパイラでまだサポートされているかどうかはわかりませんが、GCCにはその警告を抑制するために使用できる「未使用」属性があります。
BOOL saved __attribute__((unused)) = [moc save:&error];
あるいは(LLVMが上記をサポートしていない場合)、変数宣言を別の行に分割して、マクロが展開されるかどうかに関係なく変数が「使用」されることを保証できます。
BOOL saved = NO;
saved = [moc save:&error];
Xcode 4.3.2を使用して、これが機能しているように見えることがわかった(書き込みが少ない)
BOOL saved __unused;
Xcodeでは、「未使用の変数」に対する警告を設定できます。ターゲットの「ビルド設定」に移動し、「未使用」という単語でフィルタリングします
これがスクリーンショットです:
デバッグ用にのみ変更することをお勧めします。そうすれば、リリースバージョンで何かを見逃すことはありません。
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)
このようにしてみてください。それは私のために働いています。それもあなたのために働きます。
変数を使用済みとしてマークする唯一の簡単で移植可能な方法は…それを使用することです。
BOOL saved = ...;
(void)saved; // now used
ただし、既に説明したコンパイラ固有の拡張機能に満足するかもしれません。
試してください:__unused属性。 Xcode 5で動作します
#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wunused-variable"
NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop
「リリース」で「いいえ」を設定できますLLVM compliler 2.0 warning
これはCで行う方法であり、Objective-Cでも同様です。
警告を有効にしていない場合でも、戻り値を明示的に無視するようにマークすることをお勧めします。また、戻り値を忘れただけでなく、実際に明示的に無視することを選択したことを他の開発者に示します。
(void)[moc save:&error];
編集:コンパイラはvoid
へのキャストを無視するため、パフォーマンスに影響を与えることはありません。これは単なるすっきりした人間の注釈です。
2行かかるようにします。宣言とデフォルト値を分離する
BOOL enabled = NO;
// ...
BOOL enabled;
enabled = NO;