为什么[foo view]的行为与我的代码中的foo.view不同?

时间:2012-03-28 01:32:38

标签: objective-c cocoa-touch syntax declared-property

纯粹是偶然的,我发现调用[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有一些子视图需要在运行之前设置 - 特别是UIWebView。如果它们在消息之前尚未实例化发送后,消息最终转到nilfoo。)

我认为这两个在功能上是相同的 - foo.view调用与[foo view]相同的吸气剂,但实际情况并非如此;点语法获得所需的结果,而使用括号最后将消息发送到nil

如果你在十分钟前问过我,我会告诉你这两个表达式之间的区别是'语法,而不是别的'。鉴于我显然是错的,我需要了解我是怎么做错的,或者我会再次发现它。

2 个答案:

答案 0 :(得分:3)

它们在功能上是等同的。我认为这是竞争条件。当您第一次在该代码中调用foo.view时,视图尚未加载,并且会向[foo loadView]发送呼叫。在调用[foo viewDidLoad]foo.isViewLoaded == YES之前,您无法确定视图是否已加载。

您需要等待确保视图已加载,然后才能执行任何依赖该操作的操作,例如[foo aFunctionThatSendsAMessageToOneOfFoosSubViews]

在您目前的情况下,有时它会及时加载,有时则不加载。

答案 1 :(得分:-3)

如果我没有弄错,问题是[foo view]试图调用一个名为view的方法(如果没有它,则返回为零)

另一方面,在foo.view的情况下,view是类的属性