2012-11-02 4 views
1

지금 나는 ClassA : NSObject이, 다음의 ViewController viewDidLoad에서 아래 코드를 살펴 : 이해가 안아이폰 OS 약 retainCount

2012-11-02 14:43:35.437 RetainCountTest[1043:207] a retainCount = 1 
2012-11-02 14:43:35.439 RetainCountTest[1043:207] a retainCount = 1 b retainCount= 1 
2012-11-02 14:43:35.439 RetainCountTest[1043:207] a retainCount = 1 b retainCount= 1 

: 같은

- (void)viewDidLoad { 
    ClassA *a = [[ClassA alloc] init]; 
    NSLog(@"a retainCount = %d", [a retainCount]); 
    ClassA *b = a; 
    NSLog(@"a retainCount = %d b retainCount= %d ", [a retainCount],[b retainCount]); 
    [a release]; 
    NSLog(@"a retainCount = %d b retainCount= %d", [a retainCount],[b retainCount]); 
    [super viewDidLoad]; 
} 

콘솔 출력이 보인다 그게 내가 [a release]라고 부를 때, 왜 [a retainCount]== 1?

+0

고마워요! @ mttrb, 이것은 매우 유용합니다. – Maggie

+1

면접 원이 retainCount에 대해 물었습니까? – bbum

+0

@bbum 어쩌면 트릭 질문이었을 것입니다. "retainCount, 특히 죽은 객체에 보내지 말아야합니다"라는 말이 정답이었습니다. –

답변

1

당신은 결코 retainCount 's에주의해서는 안됩니다. 그들은 혼란스럽고 최악의 경우 오해의 소지가 있습니다. 사람들은 retain/release의 메모리 관리 규칙을 올바르게 따르고 retainCounts를 잊어 버려야합니다.

documentation 가입일

..

이 방법은 메모리 관리 문제를 디버깅없는 값이다. 어떤 프레임 워크 객체도 주문에 객체를 보유 할 수 있기 때문에 참조를 보유하고있는 동시에 동시에 자동 릴리스 풀은 객체에 지연 릴리스를 얼마든지 보유 할 수 있으므로 은 얻을 수 없을 가능성이 매우 낮습니다 이 메소드의 유용한 정보.

편집 : 제안

When to use -retainCount?

편집 읽기 :

Cocoa Core Memory Management rules

만들거나 개체를 복사에서 그 유지 카운트가 1 OP의 코멘트를 본 후 그 후 다른 객체는 소유권을 나타낼 수 있습니다. 귀하의 개체에서 어떤 보유 개수를 증가시킵니다. 객체 소유자는 소유권을 포기할 수도 있습니다. 보유는 수를 감소시킵니다. 보관 횟수가 0이되면 개체가 할당 해제됩니다 (파괴 된) .

이 글을 읽으면 오 retainCount가 신조라고 생각할 수 있으며 NSLog 문을 사용하여 개체의 전체 할당/유지/릴리스주기를 볼 수 있습니다. 그러나 실제로 그렇게 작동하지는 않습니다. 당신은 당신이 만드는 대상에 대한 유일한 소유권이 있다고 말할 수는 없습니다. 이 객체는 다른 프레임 워크 객체에 의해 유지 될 수 있습니다. 그리고 당신은 소유권을 포기하고 있습니다. 다른 모든 오브젝트가 참조를 제거한 후에 만 ​​오브젝트가 해제됩니다.

공개 API에 왜 남아 있는지 알 수 없습니다.

+0

대단히 감사합니다. krishnabhadra, 오늘 인터뷰 담당자가 테스트 해주세요. [릴리스]를 사용할 때 0이되어야한다고 대답했습니다. 이제 Xcode에서 테스트 했으므로 출력은 1이므로 혼란 스럽습니다. – Maggie

+0

다시 한번 감사드립니다, @Krishnabhadra, 네 말이 맞아, 나는 기억 관리의 규칙을 따라야 해. – Maggie

+0

FWIW, ARC에서'retainCount' 메시지를 보내거나'@selector (retainCount)'리터럴을 사용하는 것은 불법입니다. –

4

"retainCount is useless"입니다.

일부 컨텍스트 추가 : '죽은'개체를 메시징 할 때 정의되지 않은 동작이 예상됩니다.

+0

나는 일반적으로 그런 짧은 대답을 좋아하지 않지만, 링크 된 기사는 그것을 아주 잘 설명한다. – justin

+0

대단히 감사합니다. 저스틴, 오늘 인터뷰 담당자가 테스트 해주세요. [릴리스]를 사용할 때 0이되어야한다고 답변했습니다. 이제 Xcode에서 테스트 했으므로 여전히 1을 출력하므로 혼란 스럽습니다. 나는 물을 수 있는가? 어디에서 retainCount가 0이 되었는가? – Maggie

+1

@Maggie 연결된 문서의 5 번 지점에서 : "retainCount 메서드는 절대로 0을 반환 할 수 없습니다." 특히이 경우에는 정의되지 않은 동작 만 기대하면됩니다. 참조 횟수 연산을 추적하려면 Instruments가이를 기록합니다. – justin

1

[릴리스]를 호출하면 더 이상 '해제'상태가되지 않으므로 a가 할당 취소 될 수 있습니다. 소유권이 공유되기 때문에 여기에있는 경우 일 수 있습니다.

a에 대한 모든 메시지는 정의되지 않은 반환 값을 가지고 있습니다. 다른 객체가 메모리 슬롯을 다시 사용했을 수 있습니다.

따라서 인쇄하는 반환 값은 본질적으로 임의입니다. 그것은 귀하의 응용 프로그램을 추락 또는 1000 인쇄 ...