1

나는 모든 메모리 문제를 처리하고 메모리 관리를 읽으려고 내 응용 프로그램을 통해 돌아갔다. [object retainCount]를 사용하여 메모리 할당을 추적하기 시작했습니다. 카운트가 정말 이상하다는 사실을 계속 알고 있기 때문에 신뢰할 수 있습니까? 이 점을 염두에 응용 프로그램 대리자를보유 회수가 너무 많은 이유는 무엇입니까? 메모리 관리

베어와 빈 mainViewController 차이는 없습니다 :

사람은 다음을 설명 할 수 없습니다. initWithRootViewController는 올라갈 수를 일으키는 것입니다,하지만 난 하나 ....

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


/* Create the View Controllers */ 
UIViewController *mainViewControl = [[[MainViewController alloc] init] autorelease]; 


/* Create the Navigation Controller */ 
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:mainViewControl] autorelease]; 


NSLog(@"retain count: %i",[mainViewControl retainCount]); 

/* Set the toolbar to purple */ 
navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent; 
navigationController.navigationBar.tintColor = [UIColor colorWithRed:.6 green:.1 blue:.4 alpha:0.4]; 
navigationController.navigationBar.translucent = YES; 

NSLog(@"retain count: %i",[mainViewControl retainCount]); 
navigationController.toolbar.barStyle = UIBarStyleBlackTranslucent; 
navigationController.toolbar.tintColor = [UIColor colorWithRed:.6 green:.1 blue:.4 alpha:0.4]; 
navigationController.toolbar.translucent = YES; 

[navigationController setNavigationBarHidden:YES animated:NO]; 
[navigationController setToolbarHidden:YES animated:NO]; 

NSLog(@"retain count: %i",[mainViewControl retainCount]); 

[window addSubview:[navigationController view]]; 

NSLog(@"retain count: %i",[mainViewControl retainCount]); 

을 추가하는 또 다른 방법이 표시되지 않습니다 그리고 이것은 로그 ~

2011-01-17 19:47:21.278 ANA[5653:207] 3
2011-01-17 19:47:21.282 ANA[5653:207] 4
2011-01-17 19:47:21.286 ANA[5653:207] 7
2011-01-17 19:47:21.287 ANA[5653:207] 12
2011-01-17 19:47:21.301 ANA[5653:207] Load View

I 돈이다 이 속성을 변경하거나 navigationController를 참조하는 것이 보유 횟수를 늘리는 이유인지 이해할 수 없습니다.

나는 자동 반복 기능을 사용하지 않고 수동으로 릴리스했지만 그 결과는 동일합니다. 기본적으로 나는 이해하지 못하고 retainCount 명령이 신뢰할 만한지 궁금합니다. 이해할 수 없으면 다른 곳에서 메모리 문제를 디버깅 할 수 없다고 생각합니다.

+0

가능한 복제본 [할당 또는 보존 된 객체를 몇 번이나 해제합니까?] (http://stackoverflow.com/questions/3730804/how-many-times-do-i-release-an-allocated-or- -retained-object) –

+0

묻는 질문이 다르긴하지만 문제는 두 질문 사이에서 동일합니다. –

+0

잘 될 수 있었고이 문제에 대한 해답을 찾고 있었지만 어떻게 적용되는지를 알기가 어려웠습니다. 질문은 실제로 '나는 [object retainCount]를 신뢰할 수 있습니까?'라는 대답과 그 대답이 너무 좋고 명확하게 '아니오'여야합니다! 틀림없이 나는 너의 연결을 발견하지 않았다. – Ben

답변

7

official documentation for -retainCount,

중요 :이 방법은 메모리 관리 문제를 디버깅에 어떤 가치가 일반적이다. 프레임 워크 객체의 수는 객체에 대한 참조를 유지하기 위해 유지 되었기 때문에 동시에 자동 릴리즈 풀은 객체에 지연 릴리스 수에 제한이 없으므로이 객체에서 유용한 정보를 얻을 수있는 가능성은 거의 없습니다. 방법.

-retainCount에 의존하지 마십시오. 다른 객체는 모르는 사이에 객체를 보유 할 수 있으며 자동 반복 객체는 실제 보유 수에 대한 잘못된 인상을 줄 수 있습니다.

Apple 프레임 워크 개체를 사용하여 올바른 작업을 수행하고 적절할 때 개체 소유권을 양도 할 수 있으며 도 그렇게해야합니다.

+3

Apple은'retainCount' 또는 뭔가를 사용하려고 시도 할 때 Xcode 침을 경고합니다. – BoltClock

+1

나는 Bill Bumgarner를 이길 때 당신이 놀랐다. 나는 그가 가지고있는 것 같아요 ** - 지금 텍스트 매크로로 -retainCount. **를 사용하지 마십시오 : http://stackoverflow.com/questions/3730804/how-many-times-do-i-release-an-allocated-or- 유지 된 물체/3730835 # 3730835 –

+0

@ 브래드 하하, 빛나는! 나는 Markdown 헤더를 사용하는 것을 좋아한다. =) –