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. 和foo。)

我认为这两者在功能上是相同的——foo.view调用相同的 getter [foo view],但实际上并非如此;点语法得到了想要的结果,而使用方括号最终将消息发送到nil.

如果你十分钟前问我,我会告诉你这两种表达方式的区别是“语法,仅此而已”。鉴于我显然错了,我需要了解我是如何错的,否则我会再次绊倒它。

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 的方法(如果你没有它,则返回为零)

另一方面,对于 foo.view,view 是类的属性

于 2012-03-28T01:43:48.033 回答