これは極めて基本的な質問です。そのようにオブジェクトを初期化すると...
UIView *view;
if (!view) {
view = [[UIView alloc] init];
}
// Do something with view
コンパイラ エラーは発生しませんが、Xcode がUIView
通常のように強調表示されないことに気付きました。初期化に悪い習慣を使用していますか?
これは極めて基本的な質問です。そのようにオブジェクトを初期化すると...
UIView *view;
if (!view) {
view = [[UIView alloc] init];
}
// Do something with view
コンパイラ エラーは発生しませんが、Xcode がUIView
通常のように強調表示されないことに気付きました。初期化に悪い習慣を使用していますか?
そのコードには 2 つの問題があります。
view
0、何かへのポインター、またはガベージ値である可能性があります。実際にこれをインスタンス変数として別の場所で宣言していますか?
強調表示に関して、どの「UIView」が強調表示されていませんか? 両方?ファイルをリロードするか、Xcode を再起動してみます。
私が挙げた 2 つの問題を修正するには、それを次のコードに置き換えます。
UIView *view = [[UIView alloc] init];
これは別の問題を引き起こします: ARC では、インスタンス変数に格納するか、フレームワーク (スーパービューなど) が別の場所に格納しない限り、変数がスコープ外になると、新しく割り当てられたビューの割り当てが解除されます。
ARC の代わりに手動で保持と解放を使用している場合、そのメソッドが呼び出されるたびに UIView がリークします。
ローカル var を宣言してから、それが nil かどうかを確認することはありません。意味がありません。
一方、プロパティの場合は、はい、遅延インスタンス化:
if (!myView) {
myView = [[UIView alloc] init];
}
1 行目と 2 行目の間にコードを挿入してください。そうでない場合は、初期化されていないローカル変数の値を読み取っているため、これは未定義の動作です。つまり、純粋な偶然によってゼロ以外になる可能性があります。
ビューが ivar の場合、それは異なります。これらは、インスタンスの構築時にゼロに初期化されます。
現状では、これは厄介で、実際には意味がありません。割り当てる前にローカル変数をチェックするのはなぜですか?これが変更され、これが実際にインスタンス変数またはプロパティを遅延ロードするメソッドである場合、はい、これは良い方法です。これが単なる正規変数である場合、それはせいぜいノイズであり、最悪の場合、ダングリングポインタを作成しました。
うん、それはそれを行う良い方法です。必要に応じて、if ステートメントを view というメソッド内に配置して、それ自体を返すようにすることができます。これは遅延インスタンス化と呼ばれ、非常に一般的で受け入れられています。