2011-07-31 4 views
0
navigationController = [[[UINavigationController alloc] initWithRootViewController:firstMenuView] autorelease]; 
[view addSubview:navigationController.view]; 

view는 navigtioncontroller에서 보존 상태를 유지합니까? 아니면 그것을 유지해야합니까?내 uinavigationcontroller는 유지되거나 해제 될 예정입니까?

navcontroller.view removefromparent를 호출하면 실제로 nav 컨트롤러가 해제됩니까?

답변

2

컨트롤러가보기의 owner이고보기가 컨트롤러에 약한 참조 (0-)를 유지하면 컨트롤러는보기에 대한 강력한 참조를 유지합니다. 이 경우 네비게이션 컨트롤이 자동으로 릴리즈되었으므로 다른 사람이 아무 것도 없으면 이론적으로 할당이 취소됩니다. retain.

반면 navigationController의 보기은 다른보기에 하위보기로 추가되었으므로 상위보기에서 유지됩니다. 뷰에 컨트롤러에 대한 호출이 있으면 해당 호출은 할당 해제 된 객체로 이동하기 때문에 이것은 문제입니다. 시간의 99 %에 대해 EXC_BAD_ACCESS이 발생하고 앱이 다운됩니다. 나머지 1 %는 훨씬 더 나 빠졌습니다.

다행히도 위에서 언급 한 재난을 막기 위해해야 ​​할 일은 내비게이션 컨트롤러를 "소유"하고, @property (retain)를 부여하고 네비게이션 컨트롤러를 할당하는 것입니다. (자동 복구 유지, 그 부분은 좋다) 네비게이션 컨트롤러를 소유 할 좋은 후보자는 부모보기의보기 컨트롤러와 응용 프로그램 위임자입니다.

이렇게하면 컨트롤러는 적어도 한 번 이상 유지되므로 필요할 때마다 계속 붙어 있습니다.

여기서 중요한 것은 컨트롤러와보기를 구분하는 것입니다. 뷰 객체는 유지되고 컨트롤러 객체는 자동으로 다시 할당되기 때문에 유지하지 않으면 사라집니다.

1

addSubview:navigationController.view을 유지합니다. 그것을 부모에게서 제거하십시오 releases 그것. 자동으로 작업을 수행 했으므로 보관하거나 해제 할 필요가 없습니다. 귀하를 위해 자동 처리됩니다.

+1

을 제외하고는 자동 응답으로 – Colin

+0

수정 됨 - 감사합니다. –

0

아니요,보기 컨트롤러가보기 컨트롤러가보기 컨트롤러의 이기 때문에보기 컨트롤러가 해제되지 않습니다. 보기 컨트롤러의보기가보기 컨트롤러와 같은 개체가 아닙니다. 상위 뷰에 뷰 컨트롤러를 추가하지 않습니다.

관련 문제