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

Ron*_*gge 7 syntax cocoa-touch objective-c 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];
Run Code Online (Sandbox Code Playgroud)

(最后一行是因为foo有一些子视图需要在运行之前设置 - 特别是a UIWebView.如果在发送消息之前它们还没有被实例化,那么消息就会结束nil.有foo.)

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

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

ros*_*eau 3

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

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

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