2016-12-06 6 views

답변

4
{ 
    NSObject* sp = [NSObject new]; 
    NSObject* __weak wp = sp; 
} 

위의 코드는 번역되어

id sp = objc_msgSend(NSObject, "new"); 
id wp; 
objc_initWeak(&wp, sp); 
objc_destroyWeak(&wp); 
objc_storeStrong(&sp, 0); 

1) obj_initWeak 단지 확인하기 위해 강력한 포인터 sp으로 약한 포인터 wp를 연결하는 sp가 가리키는 객체가 dealloced됩니다 wp 것 자동 리셋 nil로 지정하면 뾰족한 객체의 보유 수에 영향을 미치지 않습니다.
2) obj_destroyWeak weak 포인터와 strong 포인터의 연관성을 파괴합니다.
3) obj_storeStrong의 마지막 문장은 [sp release]입니다.

그러나 약한 포인터를 사용하자마자 컴파일러는 가리킨 객체에 대한 새로운 참조를 생성합니다.

{ 
    NSObject* sp = [NSObject new]; 
    NSObject* __weak wp = sp; 
    NSLog(@"%@", wp); 
} 

id sp = objc_msgSend(NSObject, "new"); 
id wp; 
objc_initWeak(&wp, sp); 
id tmp = objc_loadWeakRetained(wp); 
NSLog(@"%@", wp); 
objc_release(tmp); 
objc_destroyWeak(&wp); 
objc_storeStrong(&sp, 0); 

objc_loadWeakRetainedtmpNSLog 문에서 살아 있는지 확인하기 위해 참조 카운트를 증가 것이다됩니다. objc_release 개체를 원래 상태로 다시 설정합니다.

결론적으로이 디자인은 __weak이므로 약한 포인터를 사용하는 동안 상태가 일관되게 유지됩니다. __weak의 새로운 implmenetation은 Apple LLVM version 8.0.0 (clang-800.0.42.1)으로 릴리스를 autoreleasepool으로 전달하지 않지만 objc_release을 직접 사용하십시오.