2009-08-09 3 views
1

에리카 사둔 (Erica Sadun)의 책 "The iPhone Developer 's Cookbook"의 일부보기 코드를 시험 해보았으며 이해할 수없는 코드를 발견했습니다. 여기에는 loadView 방법에 대한 코드이다 : 그녀가있는 contentView가 해제 않는 이유왜 iPhone Developer 's Cookbook의이 코드가 작동합니까?

- (void)loadView 
{ 
    // Create the main view 
    UIView *contentView = [[UIView alloc] initWithFrame: 
     [[UIScreen mainScreen] applicationFrame]]; 
    contentView.backgroundColor = [UIColor whiteColor]; 
    self.view = contentView; 
    [contentView release]; 

    // Get the view bounds as our starting point 
    CGRect apprect = [contentView bounds]; 

    // Add each inset subview 
    UIView *subview = [[UIView alloc] 
     initWithFrame:CGRectInset(apprect, 32.0f, 32.0f)]; 
    subview.backgroundColor = [UIColor lightGrayColor]; 
    [contentView addSubview:subview]; 
    [subview release]; 
} 

내 질문은,하지만 다음 [contentView addSubview:subview]에 다시 사용? self.view = contentView 보유 contentView가 있습니까?

+0

잘못된 것처럼 보입니다. 'contentView'는 메서드가 끝날 때까지 공개되지 않으므로 아무런 문제가 발생하지는 않지만 의도적으로이 방법으로 빌드하는 이유는 상상할 수 없습니다. – kubi

+0

아닙니다. self.view에 대한 할당은 contentView를 유지하므로, 바로 뒤에서 풀어주는 것은 객체를 만들 때 얻을 수있는 가장 가까운 방법입니다. 코코아 패러다임에서 볼 때 뷰 컨트롤러가 뷰를 유지하기 때문에 의도적으로이 방법으로 구현됩니다. –

답변

7

에 무슨 일이 일어나고 있는지 :

@property(nonatomic, retain) UIView *view;

이것은 즉, 당신은 setView 사용할 때 : 방법을 (또는 =의 왼쪽에있는 .view를 사용하면, 전달한 값은 그대로 유지됩니다). 당신이 코드를 통해 이동의 수를 유지 보면 그래서, 당신은이를 얻을 수 있습니다 :

- (void)loadView { 
    // Create the main view 
    UIView *contentView = [[UIView alloc] initWithFrame: 
      [[UIScreen mainScreen] applicationFrame]]; //retain count +1 
    contentView.backgroundColor = [UIColor whiteColor]; //retain count +1 
    self.view = contentView; //retain count +2 
    [contentView release]; //retain count +1 

    // Get the view bounds as our starting point 
    CGRect apprect = [contentView bounds]; 

    // Add each inset subview 
    UIView *subview = [[UIView alloc] 
      initWithFrame:CGRectInset(apprect, 32.0f, 32.0f)]; 
    subview.backgroundColor = [UIColor lightGrayColor]; 
    [contentView addSubview:subview]; 
    [subview release]; 

}

내가 정말 흥미로운 것은 그있는 contentView를 해제 한 후라고 말하고 싶지만 우리는 여전히 수 contentView의 포인터 끝 부분에있는 객체가 여전히 존재하기 때문에 (setView를 호출하여 객체를 보존했기 때문에) 메시지를 보내십시오.

+1

이 올바른지 만, 나는이 스타일/패턴을 개인적으로 피한다 - 어떤 시점에서 그 속성을'retain'에서'assign'으로 변경하기로 결정했다면이 코드는 자발적으로 충돌하기 시작합니다. 물론 이것은 UIViewController.view 속성의 문제가 아니지만 자신의 속성에 따라 문제가 발생할 수 있습니다. –

+1

네, 이것이 정확하게 작동하는 이유이며, 끔찍한 형태입니다. 특정 참조를 릴리스하면 다시 사용해서는 안되며 오류가 발생하기 쉽습니다. 릴리즈가 끝나야 만합니다. 그렇지 않으면 릴리즈 이후의 contentView의 모든 모습이 self.view로 변경되어야합니다. –

+0

" 유해한"스타일이 아니라면 실제로 스타일로 적합하지 않습니다. – Amagrammer

0

u 속성이 다음과 같이 선언하면 @property (nonatomic, retain) ... TheN yes 할당 할 때 속성이 유지됩니다. 그것은 아마도 당신이 UIViewController에 대한 설명서를 보면, 당신은보기 속성으로 선언 된 것을 볼 수 있습니다

+0

문법적으로 올바른 답을 공식화하고 IM 스타일의 약어를 사용하지 않을 경우 미래에 다운 폰트를 피할 수 있습니다. (나는 downvote하지 않았다, 나는 단지 말하고있다 ...) –

+0

아이폰에서 응답을 타이핑 할 때 나는 힘들다. 나는 최소한의 글을 쓰고 실제로 코드를 잘 작성할 수는 없다.하지만 나는 생각한다. 이 대답은 Asker 어쨌든 내가 게시 한 – Daniel

관련 문제