0

これは極めて基本的な質問です。そのようにオブジェクトを初期化すると...

UIView *view;
if (!view) {
    view = [[UIView alloc] init];
}
// Do something with view

コンパイラ エラーは発生しませんが、Xcode がUIView通常のように強調表示されないことに気付きました。初期化に悪い習慣を使用していますか?

4

5 に答える 5

3

そのコードには 2 つの問題があります。

  1. Objective-C は、ローカル変数の初期化を保証しないため、view0、何かへのポインター、またはガベージ値である可能性があります。
  2. Objecitve-C が変数を初期化したとしても、宣言の直後にその値をテストしてもあまり意味がありません。

実際にこれをインスタンス変数として別の場所で宣言していますか?

強調表示に関して、どの「UIView」が強調表示されていませんか? 両方?ファイルをリロードするか、Xcode を再起動してみます。

私が挙げた 2 つの問題を修正するには、それを次のコードに置き換えます。

UIView *view = [[UIView alloc] init];

これは別の問題を引き起こします: ARC では、インスタンス変数に格納するか、フレームワーク (スーパービューなど) が別の場所に格納しない限り、変数がスコープ外になると、新しく割り当てられたビューの割り当てが解除されます。

ARC の代わりに手動で保持と解放を使用している場合、そのメソッドが呼び出されるたびに UIView がリークします。

于 2012-07-02T16:16:22.217 に答える
2

ローカル var を宣言してから、それが nil かどうかを確認することはありません。意味がありません。

一方、プロパティの場合は、はい、遅延インスタンス化:

if (!myView) {
    myView = [[UIView alloc] init];
}
于 2012-07-02T16:16:06.677 に答える
1

1 行目と 2 行目の間にコードを挿入してください。そうでない場合は、初期化されていないローカル変数の値を読み取っているため、これは未定義の動作です。つまり、純粋な偶然によってゼロ以外になる可能性があります。

ビューが ivar の場合、それは異なります。これらは、インスタンスの構築時にゼロに初期化されます。

于 2012-07-02T16:16:12.500 に答える
0

現状では、これは厄介で、実際には意味がありません。割り当てる前にローカル変数をチェックするのはなぜですか?これが変更され、これが実際にインスタンス変数またはプロパティを遅延ロードするメソッドである場合、はい、これは良い方法です。これが単なる正規変数である場合、それはせいぜいノイズであり、最悪の場合、ダングリングポインタを作成しました。

于 2012-07-02T16:16:52.057 に答える
0

うん、それはそれを行う良い方法です。必要に応じて、if ステートメントを view というメソッド内に配置して、それ自体を返すようにすることができます。これは遅延インスタンス化と呼ばれ、非常に一般的で受け入れられています。

于 2012-07-02T16:13:05.310 に答える