ARC에서 풀 자동 풀기

2455 단어
ARC에서 대상을 초기화합니다.alloc/new/copy/mutablecopy 방법이 아니면 시스템은 대상을 처리하고 자동 방출 탱크를 추가하여 방출 시기를 지연합니다.
새 MacOS command line 항목
extern uintptr_t _objc_rootRetainCount(id obj);
extern void _objc_autoreleasePoolPrint(void);

int main(int argc, const char * argv[]) {
    NSMutableArray *arr01 = [NSMutableArray array];
    NSLog(@"%p", arr01);
    _objc_autoreleasePoolPrint();
    return 0;
}

그 결과 자동 방출 탱크의 내용을 출력하면 arr01이 자동 방출 탱크에 추가된 것을 볼 수 있습니다.
2020-04-27 13:45:39.253262+0800 AutoReleaseCMD[2977:131172] 0x10045dc80
objc[2977]: ##############
objc[2977]: AUTORELEASE POOLS for thread 0x1000d2dc0
objc[2977]: 1 releases pending.
objc[2977]: [0x10080b000]  ................  PAGE  (hot) (cold)
objc[2977]: [0x10080b038]       0x10045dc80  __NSArrayM
objc[2977]: ##############
Program ended with exit code: 0

그러나 같은 코드를 iOS 프로젝트viewDidLoad 등에 넣은 결과 자동 방출 탱크에 해당 대상이 존재하지 않아 이치상 자동 방출 탱크를 넣으면 바로 방출할 수 없다.유일한 해석은 자동 방출 탱크에 가입하기 위한 것이다.여기에 의문을 남겨 두다.
NSMutableArray *arr01 = [NSMutableArray array];
NSLog(@"%p", arr01);
_objc_autoreleasePoolPrint();

두 항목을 비교했을 때 다른 점은 하나의 운행과 Runloop 중 하나가 없다는 것이다.그래서command의 코드를 변경하여 대상의 초기화를runloop에서 발생시킵니다.
extern uintptr_t _objc_rootRetainCount(id obj);
extern void _objc_autoreleasePoolPrint(void);

int main(int argc, const char * argv[]) {
    NSLog(@"1");
    [[NSRunLoop currentRunLoop] performBlock:^{
        NSMutableArray *arr01 = [NSMutableArray array];
        NSLog(@"%p", arr01);
        _objc_autoreleasePoolPrint();
    }];
    [[NSRunLoop currentRunLoop] runUntilDate:[[NSDate date] dateByAddingTimeInterval:1000]];
    NSLog(@"2");
    return 0;
}

실행 중 대상이 자동 방출 탱크에 없는 것을 발견했다.
2020-04-27 13:53:16.209729+0800 AutoReleaseCMD[3005:134437] 1
2020-04-27 13:53:16.210792+0800 AutoReleaseCMD[3005:134437] 0x10042dfb0
objc[3005]: ##############
objc[3005]: AUTORELEASE POOLS for thread 0x1000d3dc0
objc[3005]: 2 releases pending.
objc[3005]: [0x100810000]  ................  PAGE  (hot) (cold)
objc[3005]: [0x100810038]       0x10042bf90  __NSSingleObjectArrayI
objc[3005]: [0x100810040]  ################  POOL 0x100810040
objc[3005]: ##############
objc_autoreleaseReturnValue
objc_unsafeClaimAutoreleasedReturnValue
objc_retainAutoreleasedReturnValue

세 가지 방법의 처리는 단순히 자동 방출탱크에 넣는 것만은 아니다

좋은 웹페이지 즐겨찾기