2011-05-09 1 views
0

오랫동안 휴식을 취한 Obj-C 및 iPhone 개발자를 데려 오려고 했으므로 Apress의 iPhone 3 개발 시작을 다시 읽으려고합니다. 이제Obj-C/Cocoa 인스턴스/포인터/속성 예제를 이해하는 데 도움이 필요합니다.

, 나는 다음과 같은 주위에 내 머리를 얻기 위해 사투를 벌인거야 :

#import "BlueViewController.h" 

....

@synthesize blueViewController; 

...

- (void)viewDidLoad { 
    BlueViewController *blueController = [[BlueViewController alloc] 
          initWithNibName:@"BlueView" bundle:nil]; 

    self.blueViewController = blueController; 

    [self.view insertSubview:blueController.view atIndex:0]; 

    //Why don't we use the following instead of the above? 
    //[self.view insertSubview:self.blueViewController.view atIndex:0]? 

    [blueController release]; 
    [superViewDidLoad]; 
} 

을 그것은 더 논리적 인 것 같습니다 나에게 blueController를 self.blueViewController에 할당했기 때문에 후자를 사용해야한다. 이 예제 뒤에있는 추론은 무엇입니까? 내 방식에 무슨 문제가 있니?

답변

1

명료하게 나타납니다. 가장 읽기 쉬운 코드를 작성하십시오.

.H 파일

@property (nonatomic, retain) BlueViewController *blueController; 

하는 .m 파일

@synthesize blueController=_blueController; 

- (void)viewDidLoad { 
    _blueController = [[BlueViewController alloc] 
          initWithNibName:@"BlueView" bundle:nil]; 

    [self.view insertSubview:self.blueController.view atIndex:0]; 
    [superViewDidLoad]; 
} 

_ 저 날 직접 추적 할 수 있습니다 :

나는쪽으로 경향이있다 변수 AC cess (_blueController) 대 property (self.blueController) 로의 액세스.

+0

그것은 확실히 잘 읽습니다. 다음과 같은 방식으로 작동합니까? [self.view insertSubview : _blueController.view atIndex : 0]; – Oliver

+0

예. _blueController와 self.blueController는 접근 자 메서드를 재정의하지 않기 때문에이 경우 정확히 동일합니다. 접근자를 사용하는 것과 직접 값을 설정하는 것은 동일하지 않습니다. 직접 설정은 보존을 추가하지 않으며 KVO를 트리거하지 않습니다. –

2

둘 다 동일한 참조를 가리 킵니다. 차이는 없습니다. 당신의 접근 방식도 잘 작동합니다.

+0

보유 수에 차이가 있습니까? – Oliver

+0

보유 횟수는 self.blueViewController에 할당 될 때 최대 2가되어야합니다 (기본 동작이 무시되지 않았다고 가정). 컨트롤러가 메소드 범위 끝에서 해제되면 1로 내려갑니다. – csano

관련 문제