2010-06-02 5 views
4

UIViewController에서 undestand 몇 가지 메소드를 사용하는 데 어려움을 겪고 있습니다. 그러나 먼저 인터페이스 템플릿을 사용하지 않으므로 인터페이스 빌더를 무시한다고 생각합니다.iPhone dev-viewDidUnload subviews

-init : 메모리 부족 상황 (즉, 쉽게 다시 생성 할 수없는 객체 또는 객체가 아닌)에서 해제 할 필요가없는 비 관측 관련 항목을 초기화합니다.
-loadView :보기를 만들려면 [self view] 속성을 설정하십시오.
-viewDidLoad : 다른 모든 뷰 요소를 만듭니다.
-viewDidUnload : 릴리스 개체는 -viewDidLoad에서 생성됩니다.
didReceiveMemoryWarning : 메모리 부족 상황, 캐시 된 데이터와 같은 불필요한 것들을 릴리스합니다.이보기에 수퍼 뷰가없는 경우 [super didReceiveMemoryWarning]은보기를 해제 (언로드)하고 -viewDidUnload을 호출합니다.
-dealloc : 모두에게 공개
-viewWillAppear:, -viewDidAppear:, -viewWillDisappear:, -viewDidDisappear: 자명, 당신이 그 이벤트 (무언가를) 응답하지 않으려면 필요는 없습니다.

몇 가지 사항에 대해서는 잘 모르겠습니다. 첫째, Apple의 문서에 따르면 -viewDidUnload이 호출되면보기가 이미 해제되고 nil로 설정됩니다.

  1. -loadView 나중에 다시보기가 다시 생성됩니까?
  2. -viewDidLoad에서 내가 만든 ivar/속성을 만들지 않은 이유는 필요가 없기 때문이며보기에 유지되기 때문입니다 (하위보기이기 때문에). 따라서보기가 해제 될 때도 해제됩니다. 보기가 해제되면 모든 하위보기가 해제됩니까? -viewDidLoad에서 만든 모든 객체가 [self view]의 하위 뷰이기 때문입니다. 따라서 이미 출시 된 경우 -viewDidUnload에 다시 게시해야하는 이유는 무엇입니까? 이러한 방법으로 뷰를로드하고 언로드 할 때 필요한 데이터를 이해할 수 있지만 요청한 것처럼 하위 뷰가 이미 해제 된 이유는 무엇입니까?

편집는 : 다른 질문을 읽은 후, 나는 그것을 (내 두번째 질문)을 가지고 있다고 생각. 내가 로컬 변수를 사용하고, alloc하고, subview와 release하게하는 상황에서, retain count가 1이 될 것이다. (서브 뷰로 추가하는 것에서부터) 뷰가 릴리즈 될 때도 그렇다. 이제 ivars가 가리키는 뷰 요소에 대해 외부 클래스가 액세스 할 필요가 없으므로 속성을 사용하지 않았습니다. 하지만 지금은 그 때문에이 상황에서, 잘못 생각하십시오 바르가 유지되지 않았기 때문에이 없었기 때문에 그것이 (할당 해제 된 후 그 상황에서

// MyViewController.h 
@interface MyViewController : UIViewController { 
    UILabel *myLabel; 
} 

// MyViewController.m 
. . . 
- (void)viewDidLoad { 
    myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 10)]; 
    [myLabel setText:@"Foobar"]; 
    [[self view] addSubview:myLabel]; 
} 

- (void)viewDidUnload [ 
    // equivalent of [self setMyLabel:nil]; without properties 
    [myLabel release]; 
    myLabel = nil; 
} 

, 레이블이 -release 메시지가 전송됩니다 재산). 그러나 재산으로 보유 수는 2 일 것입니다 : 그것 및 재산을 보유하는 전망. 그러면 -viewDidUnload에서 할당이 해제됩니다. 그래서 항상 이런 것들에 대한 속성을 사용하는 것이 가장 좋습니다. 맞습니까? 안 그래요?

답변

2

-loadView 나중에 뷰를 다시 만들려면 호출 되나요?

예, 누군가가 view 속성에 액세스하자 마자.

보기가 해제되면 모든 하위보기가 해제됩니까?

예. 나중에 필요하지 않은 레이블과 같은 물건에 관해서는

은, 일반적인 접근 방식은보기에 첨부 한 후 단순히 해제하는 것입니다 : 라벨이 해제됩니다이 경우

UILabel *foo = [[UILabel alloc] init…]; 
[self.view addSubview:foo]; 
[foo release]; 

때 뷰가 할당 해제됩니다.


예제의 메모리 관리에 문제가 없습니다. 레이블이 alloc 인 경우 해당 retainCount이 1로 홉 (hop)하고보기가이 값을 유지하면 (retainCount = 2) 뷰가 할당이 해제되고 레이블 (rc = 1)을 놓은 다음 마침내 사용자가 직접 레이블을 해제합니다 (rc = 0, dealloc).

변수를 더 명확하게 만들기 위해 변수 myLabel은 레이블을 명시 적으로 보유하지 않지만 사용자가 할당했기 때문에 레이블을 소유합니다. 이는 코코아 메모리 관리의 기본 규칙 중 하나입니다. alloc +1, retain +1, release-1, autorelease-1 이후입니다.

예 : 라벨이 ALLOC 중 하나를 얻고 세터 다른 하나는 foo 속성으로 생성하기 때문에

@property(retain) UILabel *foo; 
self.foo = [[UILabel alloc] init…]; 

이가 누출 될 것이다. Cocoa Memory Management Guide 또는 Scott Stevenson’s Objective-C tutorial을 읽으십시오. Cocoa의 메모리 관리는 매우 간단하며 약간의 사고 후에 모든 상황에서 완벽하게 편안해야합니다.

+0

감사합니다. 지금은 이해합니다. 하지만 내가 편집 한 내 게시물의 마지막 부분 인 속성을 사용하는 것이 맞습니까? – mk12

+0

'-viewDidUnload'는'-viewDidLoad'에서 다시 생성 할 데이터를 언로드하는 것 외에도'-viewDidUnload'의 하위 뷰를 유지하는 속성 ('[self setProperty : nil]')을 해제하기위한 것입니다. [self view]'는 이미 풀어 놓았으므로 할당 취소 될 수 있습니다. 내가 맞습니까? – mk12

+0

그러나 나는 그 코드가 작동하지 않는다고 생각했습니다. 멤버 변수 myLabel은 결코 UILabel을 유지하지 않으므로 (보기 만), 여전히'-viewDidUnload'에서 해제합니다. 아니면 제가 설명했던 것에 대해 이야기하고 있었습니까? 내가 결정하려고하는 것은이 속성 (멤버 변수가 필요한 곳)에 항상 속성을 사용해야한다는 것입니다. – mk12

관련 문제