2017-10-09 2 views
0

私は以下のような方法がある場合:_VIEWはオブジェクトへのポインタであるオブジェクトがnilの場合に返されるメソッドの明示的なチェック?

-(BOOL)shouldResize { 
    return _view != nil; 
} 

を、お勧めします/必要に応じて明示的にnilのチェックである、またはそれは単に行うに十分なものである:

-(BOOL)shouldResize { 
    return _view; 
} 

いずれかの奇妙な振る舞いはここでの例のように、BOOLへのポインタをキャストにポップアップする可能性がある場合、私は思ったんだけど:https://developer.apple.com/documentation/objectivec/bool?language=objc

(私はあなたにも、右return !!_viewを行うことができると思います?)

+0

FYI - 2番目のコードセットは、 'BOOL'変数を' NO'や 'YES'と直接比較してはいけません。単に 'if(someBool)'や 'if'(!someBool) 'を実行するだけです。 'if(someBool == YES)'や 'if(someBool == NO)'や '!='と似ていると、見つけにくいバグで失敗するかもしれません。 – rmaddy

+0

興味深いことに、チップのおかげで!最初に、そのような不具合が発生するはずですが、ちょっと壊れたようです。 – dobse

+0

どのようなバグですか?この問題は、 'BOOL'をゼロと非ゼロとして扱うときだけです。 'BOOL'はゼロと非ゼロではなく' NO'と 'YES'だけでなければなりません。ここでの唯一のバグは、オブジェクトポインタを 'BOOL'として扱う2番目のコード例です。 – rmaddy

答えて

1

プラットフォームまたはアーキテクチャによっては、BOOLsigned charに相当する場合があります。したがって、return _viewは安全ではありません。 _viewの実際のポインタ値は、1バイトに切り捨てられます。 _viewnilでなくても、このバイトは0になる可能性が非常に高いです。その場合、コードは真でなければならないときにfalseを返します。

return _view != nilは安全で妥当です。 return !!_viewを使用することは正しいですし、チームのコーディング基準によっては適切でないかもしれません。いくつかの場所では、それはブール式を「正規化」する慣用的な方法です。他の人は、それを半分賢く見たり、 "醜い"(これは他の答えで表現されているように)かもしれません。

+0

+1だけでも、最初の段落だけでも '_view'を返すことで、最後のバイトを除いてすべてが切り捨てられ、0に評価されます。これはほとんどの場合「動作する」ほど稀な非常に微妙なバグですが、無作為に。 –

+0

ありがとう!あなたの答えに公平性を褒める(:私が返品4294967040(ff ff ff 00)のようなことをしたかどうかを明確にするために、それは偽と評価されるでしょうか? – dobse

-1

ビューがnilかどうかを確認するだけで自動的に処理されます。それが無ければ、NOとYESを返します。そうでなければ、shouldResizeの2番目のバージョンで十分です。

私のベストプラクティスは、明確な理解とより良い保守性を持ち、驚きを避けるために、明示的なゼロチェックを行うことです。

+0

ビューが 'nil'でない場合、ビューを返すことは必ずしも真の値を生成するとは限りません。なぜ私の答えを参照してください理由。 –

+0

この回答の第1段落は間違っています。オブジェクトポインタを「NO」または「YES」の値に自動的に変換することはありません。 'NO'と' nil'の値はどちらも最終的に '0'の両方の形になりますが、それは自動変換によるものです。 – rmaddy

0

わかりやすさのため、「return _view!= nil」が好きです。メソッドはブール値を返すので、メソッドのコードから明らかです。

場合によっては、2番目のオプション(return _view)も有効です。

"return!_view"私は醜いです。

0

タイプBOOLは、32ビットモードと64ビットモードで異なって定義されているため、動作が異なります。したがって、_view!= nilの代わりに_viewを返すことはバグです。

スウィフトからヒントを受け取ります(とにかくやらなければなりません)。 Swiftでは、self.view!= nilが唯一の合法的な方法になります。天に感謝します。

例として、危険な巧みさは、「復帰!_view」は単なる醜いだけではなく、間違っています。それは要求されたものの反対です。

+0

質問は 'return!_view'を使用することを提案していませんでしたが、' return !! _ view'は提案しました。それは間違っていません。醜い人は見る人の目の前にいる。また、問題はObjective-Cに関するものであり、Swiftは関連性がありません。 –

関連する問題