iOS의 retainCount

2494 단어 ios대상
우리는 iOS에서 인용 계수 기술을 이용하여 메모리를 관리하는 것을 알고 있다. 한 대상이 어느 곳에서도 인용하지 않을 때 자동으로 방출된다. 이때의retainCount는 0이고 - (NSInteger)retainCount의 방법을 제공하여 대상의 현재 보유량을 얻는다.
이 개념은 명확하고 명확하지만 두 단락의 코드를 살펴보자.
    NSNumber *number = [NSNumber numberWithInt:1];
    NSLog(@"retainCount = %lu",[number retainCount]);

이 코드의 운행 결과는 무엇입니까?
    NSString *string = [NSString stringWithFormat:@"foo"];
    NSLog(@"retainCount = %lu", [string retainCount]);

      
이 부분은요?
Xcode 5.0, ARC가 종료된 상태에서 실행한 결과:
2014-01-13 22:08:13.217 blockTest[2732:303] retainCount = 9223372036854775807
2014-01-13 22:08:13.218 BlockTest[2732:303] retain Count=1 이거 의외네요. 2단은 예상에 맞았는데 1단은 약간 안경이 떨어졌어요.
공식 문서를 찾아보니 첫마디가 "Do not use this method."뒤에 설명한 바와 같이 Autorelease pool의 존재로 인해 메모리에 대한 관리가 상당히 복잡할 수 있기 때문에retain Count는 메모리를 디버깅할 때의 근거로 사용할 수 없다.이렇게 하면 첫 번째 단락의 결과에 대해 이해할 수 있다. 아마도 시스템이 이 특수한 대상에 대해 특수한 처리를 한 것 같다(framework 안에 이미 이 대상을 만들었을지도 모른다). 그래서 우리는 매우 의외의 결과를 얻었다.
아래의 코드를 생각해 보면 좀 무섭다.
    while ([a retainCount] > 0) {
        [a release];
    }
운행 결과가 정확하다면 얼마나 행운의 한 사람입니까!
그러나 메모리에 대한 생각은 코드를 보면 더 진일보할 수 있다.
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic, retain) NSString *name;
@property(nonatomic, assign) NSInteger age;

@end

@implementation Person
- (id)init
{
    self = [super init];
    if (self) {
        self.name = @"name";
        self.age = 20;
    }
    return self;
}

- (void)dealloc
{
    NSLog(@"dealloc");
    [super dealloc];
}

@end

int main(int argc, const char * argv[])
{
    Person *per1 = [[Person alloc] init];
    //NSLog(@"retainCount = %lu -- 0",[per1 retainCount]);
    [per1 release];
    per1.age = 22;
    NSLog(@"retainCount = %lu -- 1, age = %ld",[per1 retainCount], per1.age);
    //[per1 retain];
    //per1.age = 23;
    //NSLog(@"retainCount = %lu -- 2, age = %ld",[per1 retainCount], per1.age);
    
    return 0;
}
이 코드의 운행 결과는 의외로 다음과 같다.
2014-01-13 22:17:11.619 blockTest[2758:303] dealloc
2014-01-13 22:17:11.621 BlockTest[2758:303] retainCount = 1-1,age=22http://www.cocoachina.com/ask/questions/show/106777#36483개인적으로는 대상이 확실히 소각되었다고 추측합니다. dealloc가 모두 호출되었지만 메모리에 데이터가 여전히 존재합니다. 즉각 인쇄하는 것은 내용이 존재합니다.retainCount는 0이 아닙니다. 대상이 소각되었어도 이 값은 0보다 클 수 있음을 설명할 수 있습니다.

좋은 웹페이지 즐겨찾기