7

純粋に偶然、呼び出し[bar.view addSubview:[foo view]]が機能しないことを発見[bar.view addSubview:foo.view]しましたが、次のコードでは機能します。

foo=[fooViewController alloc] initWithNibName:@"fooViewController" andBundle:nil];
[self.view addSubview:foo.view];//here's where I swap the two commands out
[foo aFunctionThatSendsAMessageToOneOfFoosSubViews];

(最後の行には、foo実行前に設定する必要があるサブビューがいくつかあるためです。特に、 a UIWebView. メッセージが送信される前にそれらがインスタンス化されていない場合、メッセージはnil. Withに移動しfooます。)

これら 2 つは機能的に同一であると考えていfoo.viewました。同じゲッターを呼び出します[foo view]が、実際にはそうではありません。ドット構文では目的の結果が得られますが、角かっこを使用するとメッセージが に送信されnilます。

10 分前に聞いていたら、2 つの式の違いは「構文だけで、他には何もない」と答えていたでしょう。私が明らかに間違っていることを考えると、私がどのように間違っているかを理解する必要があります。

4

2 に答える 2

3

それらは機能的に同等です。これは競合状態だと思います。そのコードを最初foo.viewに呼び出したとき、ビューはまだ読み込まれておらず、呼び出しが に送信され[foo loadView]ます。[foo viewDidLoad]または が呼び出されるまで、ビューがロードされていることを確認することはできませんfoo.isViewLoaded == YES

ビューに依存するアクション ( [foo aFunctionThatSendsAMessageToOneOfFoosSubViews].

現在のケースでは、時間内にロードされる場合とそうでない場合があります。

于 2012-03-28T01:40:48.183 に答える
-3

私が間違っていなければ、問題は [foo view] が view という名前のメソッドを呼び出そうとすることです (それがない場合、戻り値は nil です)

一方、foo.viewの場合、viewはクラスのプロパティです

于 2012-03-28T01:43:48.033 に答える