2010-08-07 1 views
1

나는보기 기반 응용 프로그램을 가지고 있고 dealloc 메서드가 작동하는지 확인하면 그게 보이지 않는다 ... 디버그 및 디버그, 그리고 retainCount를 사용하여, 내 viewcontroller retaincount가 프로그램 시작에 미친 것을 발견했습니다. 쉽게 재현 ....보기 기반 응용 프로그램 - viewcontroller retainCount after [window addSubview : viewController.view];

는 새로운 뷰 기반의 애플리케이션 템플릿을 시작하고 didFinishLaunchingWithOptions에서 : 내가 콘솔에있어

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Override point for customization after app launch. 
NSLog(@"i1 %i",[viewController retainCount]); 
    [window addSubview:viewController.view]; 
NSLog(@"i2 %i",[viewController retainCount]); 
    [window makeKeyAndVisible]; 

return YES; 
} 

:이 권한은

[Session started at 2010-08-07 09:57:34 -0300.] 
2010-08-07 09:57:35.132 teste1[20367:207] i1 2 
2010-08-07 09:57:35.138 teste1[20367:207] i2 8 

입니까?

내가 애플 리케이션을 닫으려면 아이폰 홈 버튼을 누르면, dealloc 메소 nevers 호출, 난 믿기 때문에 viewController의 retainCount .... 맞아?

이것은 사과의보기 응용 프로그램 템플릿입니다 ... 작동해야합니까 ... 그렇지 않습니다?

누군가가 초기 보유 수 2 인 이유를 설명해 주실 수 있습니까? 그리고 다른 8? xib 파일이 비어 있습니다. ...

+0

alloc 후 초기 보유 수는 1입니다. 할당 직후가 아니라 프레임 워크가 몇 가지 작업을 수행 할 수있는 시간이 지난 후 기록합니다. 다시 말하지만,이 기술을 사용하여 메모리 관리 실수를 발견 할 가능성이 적기 때문에 유지 카운트에 대해 걱정할 필요가 없습니다. 단지 규칙을 따르고 정상이어야합니다. – Pablo

답변

2

메모리 관리 규칙을 따르는 한 개체의 실제 보유 횟수는 걱정할 필요가 없습니다. 프레임 워크는 오브젝트를 보유 또는 해제 할 수 있으므로 보유 수는 사용자가 제어 할 수 없도록 변경됩니다.

+0

좋아요, 답장을 보내 주셔서 감사합니다 .... 일부 NSLOG를 다른 일부 dealloc 메서드에 넣었습니다. 홈 버튼을 눌렀을 때 호출되지 않습니다. – costamatrix

+0

@costamatrix : 귀하의 응용 프로그램의 전체 수명 동안 살고 있다면, 걱정하지 마라, 시스템은 응용 프로그램이 종료 된 후에 시스템을 정리합니다. 응용 프로그램 수명 기간 동안 동적으로 생성되고 파괴되어야하는 무언가가 있고 호출 된 dealloc 메서드가 표시되지 않으면 걱정하기 시작해야합니다. – Pablo

1

앱을 종료 할 때 dealloc을 호출하지 못할 수도 있습니다. 이것은 테스트 방법이 아닙니다. 그리고 루트보기 컨트롤러는 항상 앱에 있습니다. 자신이 만든 다른 클래스에 대해 염려해야하며 종료 될 때가 아니라 콜백 될 때 해당 dealloc이 호출되도록해야합니다. 또한 retainCount에 의존하지 마십시오. Apple은 아무 데서도 사용할 것을 권장합니다.

두 개의보기와 해당보기 컨트롤러가 루트보기 컨트롤러가 아니라고 가정 해보십시오. 첫 번째보기에서 다른 개체를 만들었습니다. 이제 두 번째보기로 전환 할 때 필요하지 않은 경우 첫 번째보기의 메모리를 확보해야합니다. 이 경우 첫 번째 뷰의 객체가 실제로 할당 해제되었는지 테스트해야합니다. 이런 식으로 코딩 했는데도 호출되지 않으면 누수가 있어야합니다. 하지만 네, 당신은 애플 리케이션의 종료시 이것을 테스트해서는 안됩니다.