id __weak obj1 = obj0;
는 iOS 및 OSX에 대한 프로 멀티 스레딩 및 메모리 관리에__weak 객체가 자동 회수 풀에 추가되는 이유는 무엇입니까?
id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;
같습니다.
그러나 왜 obj1
은 autorelease 풀에 추가해야하는지, 객체의 약한 포인터를 만들어서 수명에 영향을주지 않아야한다고 생각합니다. 에
id __weak obj1 = obj0;
는 iOS 및 OSX에 대한 프로 멀티 스레딩 및 메모리 관리에__weak 객체가 자동 회수 풀에 추가되는 이유는 무엇입니까?
id __weak obj1 = obj0;
id __autoreleasing tmp = obj0;
같습니다.
그러나 왜 obj1
은 autorelease 풀에 추가해야하는지, 객체의 약한 포인터를 만들어서 수명에 영향을주지 않아야한다고 생각합니다. 에
{
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_loadWeakRetained
가 tmp
가 NSLog
문에서 살아 있는지 확인하기 위해 참조 카운트를 증가 것이다됩니다. objc_release
개체를 원래 상태로 다시 설정합니다.
결론적으로이 디자인은 __weak
이므로 약한 포인터를 사용하는 동안 상태가 일관되게 유지됩니다. __weak
의 새로운 implmenetation은 Apple LLVM version 8.0.0 (clang-800.0.42.1)
으로 릴리스를 autoreleasepool
으로 전달하지 않지만 objc_release
을 직접 사용하십시오.