2009-07-10 3 views
1

기존보기 컨트롤러에 새보기를로드하려고하지만 xib 파일에서 해당보기를로드하려고합니다. 내 계획은 두 번째 viewController (아래 코드에서 viewController1)를 만든 다음 해당 뷰를 유지하고 방금 만든 ViewController를 릴리스하는 것이 었습니다. viewController가 해제되고 뷰가 계속 고정되기를 기대했지만 그럴 수는 없습니다.ViewController를 해제하는 동안 View를 유지할 수 있습니까?

질문 1 : viewcontroller가 할당 해제되면 해당 뷰가 보유 개수에 관계없이 관련 뷰가 할당 취소됩니까? 아래 샘플 코드에서 갑자기 사라지기 전에 뷰의 보유 개수가 13임을 알 수 있습니다.

질문 2 :보기를 유지해도 retainCount가 3만큼 증가하는 이유는 무엇입니까?

PageViewController *viewController1 = [[PageViewController alloc] initWithNibName:@"Page1" bundle:nil]; 
[viewController1.view setUserInteractionEnabled:YES]; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=4 

self.currentPageView=viewController1.view; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=7 


[viewController1.view retain]; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=10 

[self.view addSubview:viewController1.view]; 

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1 
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=13 

[viewController1 release]; 

NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); 
//objc[3237]: FREED(id): message view sent to freed object=0x538ce0 

답변

1

당신이 보기이 해제되었다는되지 않습니다 "해방 된 개체에 보낸 메시지"에 대한지고있어 오류, 그것은 viewController1이 해제 된 것을, 그리고 따라서 당신은을 받고있어 "보기"메시지를 보낼 때 오류가 발생했습니다. (Objective C에서 모든 속성 액세스가 실제로 메시지를 보냅니다 ...)

왜 뷰의 보유 개수가 매번 3 번 씩 올라가고 있는지 확실하지 않습니다.

+0

감사합니다. 보유 수를 매번 3 번 올리는 이유는 아직 알지 못했지만 문제가 완전히 해결되지 않도록 리팩토링을 시도하기에 충분할만큼 지저분하다고 생각합니다. 나는 아래의 히카루의 대답에 투표하기에 충분한 명성을 얻었 으면 좋겠다. 또한 도움이되었다. – niels

1

이 도움이 될 수 있습니다 :

[[NSBundle mainBundle] loadNibNamed:@"Page1" owner:self options:nil]; 

을 자기가 기존의 ViewController입니다.

1

이 행은 viewController.view에 새로운 하위 뷰를 추가 할 수 있지만 해당 컨트롤러의 방법에는 loadView가

를 호출되지 않기 때문에 viewController1의 뷰가 아직 구축되지

self.currentPageView=viewController1.view;

무의미 왜냐하면 당신은 아직 만들어지지 않은 뷰에 객체를 추가 할 수있는 "마술"때문입니다.

사실을 변경하지 않습니다. 그 시점에서 viewController.view가 존재하지 않습니다.

참고 : 때문에 카운터를 유지에 모든 controller.view이있는 viewDidLoad /에는 loadView 방법에 내장되어 있습니다, 그리고있는 viewDidLoad /에는 loadView는 (. 예를 들어 pushController)을 표시 것까지 호출하지 않습니다

보통 내가 의존하지 않는 그것은 신뢰할 수 없습니다.