2012-03-28 1 views
7

순전히 실수로 [bar.view addSubview:[foo view]]을 호출하는 것이 작동하지 않지만 [bar.view addSubview:foo.view]이 다음 코드에서 발생한다는 것을 발견했습니다. . 특히, 그들은 메시지가 표시되기 전에 인스턴스화되지 않은 경우 전송되는 UIWebView 메시지 - foo가 실행하기 전에 설정해야 할 몇 가지 하위 뷰를 가지고 있기 때문에[foo view]가 내 코드에서 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]; 

(그 마지막 줄은 nil에가는 바람 foo으로)

나는이 두 기능적으로 동일라고 생각 - foo.view가하는 [foo view] 같은 게터를 호출하는,하지만 그렇지 않다 실제로는..; 괄호를 사용하면 메시지를 nil으로 보내는 동안 도트 구문이 원하는 결과를 얻습니다.

10 분 전에 나 한테 물어 본 적이 있다면, 두 표현의 차이점은 '구문, 그 외에는 아무것도 없음'이라고 말했을 것입니다. 내가 분명히 틀렸다는 것을 감안할 때, 내가 틀렸던 지 이해할 필요가있다. 그렇지 않으면 다시 비틀 거려야한다.

+0

'[foo view]'와'foo.view'의 실제 출력을 비교해 보았습니까? 그들은 반드시 같아야합니다. – Costique

+0

사실, 그렇습니다. NSLog (@ "View Info : % @", [foo view])와 비슷한 foo.view 문을 사용했습니다. 동일하게 - 내가 반대로해도. 똑같은 것을 돌려주는 것처럼 보입니다. – RonLugge

+1

Xcode의 도우미 편집기에서 코드를보고 턱시도 드롭 다운에서 "어셈블리"를 선택하면 도트 구문과 대괄호 사용간에 차이가 있습니까? –

답변

3

기능적으로 동일합니다. 나는 이것이 경쟁 조건이라고 생각한다. 해당 코드에서 처음으로 foo.view을 호출하면보기가 아직로드되지 않고 호출이 [foo loadView]으로 전송됩니다. [foo viewDidLoad]이 호출되거나 foo.isViewLoaded == YES이 될 때까지 뷰가로드되는지 확신 할 수 없습니다.

[foo aFunctionThatSendsAMessageToOneOfFoosSubViews]과 같은 동작을 수행하기 전에보기가로드되었는지 확인해야합니다.

귀하의 현재 사례에서 때로는 시간에로드되고 때로는 그렇지 않습니다. 내가 틀리지 않는 경우

+0

이 답변의 문제점 (특히 경쟁 조건)은 여러 테스트에서 일관성을 유지한다는 것입니다. 하나의 접근 방식은 작동하지만 다른 하나는 그렇지 않습니다. – RonLugge

+0

'self.view'를 호출하면 뷰가 강제로 _synchronously_로드됩니다. – Costique

-3

문제는 [푸보기] 방법 명명 된 뷰를 호출하려고한다는 것입니다 (그리고 당신이없는 경우 반환은 무기 호) 경우에 다른 한편으로

foo.view의 뷰는 클래스의 속성입니다

+2

속성을 합성하면 getter 및 setter 메서드가 만들어집니다. setter에 대해서는'- (void) setProperty : (PropertyClass *) property;', getter에 대해서는'- (PropertyClass *) property;'가 기본 메소드 ('UIViewController'가'view' 속성을 위해 사용하는 것)입니다. – rosslebeau

+1

또한, 존재하지 않는 메서드를 호출하려고하면 인식 할 수없는 선택기 오류로 인해 응용 프로그램이 중단됩니다. – rosslebeau

+1

yea..so 그래서 'UIViewController.h'를 살펴 보았습니다. 속성은'['class 'view]가 아니라면'[self loadView]'를 호출합니다. – skytz