2012-10-16 5 views
0

누구나이 코드 라인이 무엇을하는지 말해 줄 수 있습니까?Objective-c 객체 호출

self.viewController = [[MainViewController alloc] init]; 

의 ViewController 이미 CDVViewController 객체, 그래서 그것의 MainViewController로하고 무엇을 아주 확실하지 않다 : S를?

어떤 도움을

감사

답변

0

이 줄은 단순히 새로운 개체, 클래스 MainViewController의 인스턴스를 생성하고, 변수의 ViewController에서의 포인터를 저장하는 좋은 것입니다.

+0

그러나 viewController 이미 CDVViewController 가리키는 이해하지 못한다 : S –

+0

또한 경우 thats 경우 어떻게 변수 및 MainContController viewController에서 메서드를 액세스하는 것이라고? self.viewController [MainViewController.test = self.test]; ?? –

+0

viewController에 이미 객체에 대한 포인터가 포함되어 있으면 이전 포인터가 새 포인터로 바뀝니다. – iSofTom

0

먼저 MainViewController * 객체를 생성하고 초기화 한 다음 [self setViewController :]에 할당합니다. self.viewController는 실제 포인터 설정이 아니라 간단한 포인터 할당 (viewController가 ivar이 아닌 경우 viewController = [[MainViewController alloc] init과 같지 않음)에 대한 호출입니다.

는 @property 문 세터를 생성하는 방법에 따라 만의 그것이

@property(nonatomic, retain)*UIViewController viewController 

당신이 양식처럼 만들어 무료로 생성 된 setter 메소드 얻을이었다 가정 해 봅시다 : 그래서

- (void)setViewController:(UIViewController*)controller{ 
    if(viewController != controller){ 
     [viewController autorelease]; 
    viewController = [controller retain]; 
    } 
} 

viewController가 CDVViewController * 객체 인 경우 새 CDVViewController * 객체로 교체됩니다. CDVViewController *가 해제되고 CDVViewController가 유지되고 viewController ivar에 할당됩니다. 방금 할당을하는 경우에 그런데

, 당신은해야 할 것 :

[viewController release]; // if it was before a CDVViewController 
self.viewController = [[MainViewController alloc] init]; 

을 유지 재산

self.viewController = [[[MainViewController alloc] init] autorelease]; // it will be retained in the setter, so you must free it 

으로 코드에 따라 누수를 피하는.

+0

의 ViewController 선언됨에 : @property (비 원자, 유지) * CDVViewController의 ViewController 코드 행이 완료되면 : self.viewController = [MainViewController ALLOC] INIT]; MainViewController 속성은 어떻게 설정합니까? 하려고 시도합니다. self.viewController.token = @ "hello"; 토큰이 CDVViewController의 속성이 아님을 알리는 오류가 발생합니다. S –

+0

((MainViewController *) (self.viewController)). token = @ "hello". 그래서 컴파일러는 울지 않을 것입니다. 그러나 먼저 viewController가 실제로 MainViewController * 인 경우 컨트롤을 수행하십시오. 그렇게하지 않으면 프로그램이 울리게됩니다. *** -_- 그런데 CDVViewController *를 선언하면 안된다. -_- *** –

+0

오, 고마워. 이해가 안되는 것은 이것이 모두 완료된 방식입니다. 내 이해는 CDVViewController가 선언 된 후 MainViewController가 다형성을 사용하기 위해 MainViewController를 초기화하여 MainViewController가 다르게 수행 될 특정 메소드를 오버라이드 할 수 있도록합니다. CDVViewController를 통해. 그러나 MainViewController는 이미 CDVViewController를 상속받습니다. 따라서 viewController를 CDVViewContoller 대신 MainViewController로 선언하지 않으면 동일한 방식으로 작동하지 않겠습니까? –