iOS 런타임 면접문제(runtime는 weak 변수의 자동 설정을 어떻게 실현합니까? SideTable를 아십니까?)

3184 단어
runtime는 어떻게 weak 변수의 자동 설정을 실현합니까?SideTable 아세요?
runtime는 등록된 클래스를 레이아웃하고 weak 수식의 대상은hash표에 넣습니다.weak가 가리키는 대상의 메모리 주소를 키로 하고 이 대상의 인용 계수가 0일 때 dealloc를 사용합니다. 만약 weak가 가리키는 대상의 메모리 주소가 a라면 a를 키로 하고 이 weak표에서 검색하여 a를 키로 하는 모든 weak 대상을 찾아서 nil로 설정합니다.
좀 더 자세한 대답:
1. 초기화 시:runtime에서 objc 호출initWeak 함수, 새로운 weak 포인터가 대상의 주소를 가리키는 것을 초기화합니다.2. 참조를 추가할 때: objcinitWeak 함수는 objc 를 호출합니다.storeWeak () 함수, objcstoreWeak () 의 역할은 포인터 지향을 업데이트하고 대응하는 약한 인용표를 만드는 것입니다.3. 해제할 때clearDeallocating 함수를 호출합니다.clearDeallocating 함수는 우선 대상 주소에 따라 모든 weak 포인터 주소의 그룹을 가져오고, 이 그룹을 옮겨다니며 그 중의 데이터를 nil로 설정하고, 마지막으로 이entry를 weak표에서 삭제하고, 마지막으로 대상의 기록을 정리합니다.
SideTable 구조체는 관리 클래스의 인용 계수표와 weak표를 담당하고
상해: 《Objective-C 고급 프로그래밍》이라는 책에서 참조.초기화 시:runtime에서 objc 를 호출합니다initWeak 함수, 새로운 weak 포인터가 대상의 주소를 가리키는 것을 초기화합니다.
{
    NSObject *obj = [[NSObject alloc] init];
    id __weak obj1 = obj;
}

weak 변수를 초기화하면 runtime에서 NSObject를 호출합니다.mm의 objcinitWeak 함수.
//  
 id obj1;
 objc_initWeak(&obj1, obj);
/*obj 0, */
 objc_destroyWeak(&obj1);

objc 통과하기initWeak 함수에서 "weak 수식자가 첨부된 변수(obj1)"를 초기화하고 변수 작용역이 끝날 때objcDestoryWeak 함수는 변수를 해제합니다(obj1).
2. 참조를 추가할 때: objcinitWeak 함수는 objc 를 호출합니다.storeWeak () 함수, objcstoreWeak () 의 역할은 포인터 지향을 업데이트하고 대응하는 약한 인용표를 만드는 것입니다.
objc_initWeak 함수는 "weak 수식자 첨부 변수(obj1)"를 0(nil)으로 초기화한 후 "값 부여 대상"(obj)을 매개 변수로 하고objcstoreWeak 함수.
obj1 = 0;
obj_storeWeak(&obj1, obj);

즉,
weak 수식의 바늘 기본값은 nil입니다. (Objective-C에서 nil에 메시지를 보내는 것은 안전합니다)
그리고 objDestroyWeak 함수는 0(nil)을 매개 변수로 하고 objc 를 호출합니다.storeWeak 함수.
objc_storeWeak(&obj1, 0);

앞의 원본 코드는 아래의 원본 코드와 같다.
//  
id obj1;
obj1 = 0;
objc_storeWeak(&obj1, obj);
/* ... obj 0, nil ... */
objc_storeWeak(&obj1, 0);

objc_storeWeak 함수는 두 번째 매개 변수의 값 부여 대상(obj)의 메모리 주소를 키 값으로 하고 첫 번째 매개 변수weak 수식된 속성 변수 (obj1)의 메모리 주소가 weak 테이블에 등록됩니다.두 번째 인자 (obj) 가 0 (nil) 이면 변수 (obj1) 의 주소를 weak표에서 삭제합니다.
하나의 대상이 여러 개에 동시에 값을 부여할 수 있기 때문에weak 수식자의 변수 중 키 값에 대해 여러 변수의 주소를 등록할 수 있습니다.
objcstoreWeak(&a, b): objcstoreWeak (value, 키) 를 사용하고 키가 nil이 되면 value를 nil로 설정합니다.b가 nil이 아닐 때, a와 b는 같은 메모리 주소를 가리키고, b가 nil이 될 때, a가 nil이 된다.이 때 a에 메시지를 보내면 붕괴되지 않습니다. Objective-C에서 nil에 메시지를 보내는 것은 안전합니다.
3. 해제할 때clearDeallocating 함수를 호출합니다.clearDeallocating 함수는 우선 대상 주소에 따라 모든 weak 포인터 주소의 그룹을 가져오고, 이 그룹을 옮겨다니며 그 중의 데이터를 nil로 설정하고, 마지막으로 이entry를 weak표에서 삭제하고, 마지막으로 대상의 기록을 정리합니다.
weak 인용이 가리키는 대상이 풀렸을 때 weak 지침을 어떻게 처리합니까?객체를 해제할 때 기본 절차는 다음과 같습니다.
1. objc 호출release 2.대상의 인용 계수가 0이기 때문에 dealloc 3을 실행합니다.dealloc에서 호출됨objc_rootDealloc 함수 4. 에서objc_rootDealloc에서 Object 호출됨dispose 함수 5.objc 호출destructInstance 6.마지막으로 objc 호출clear_deallocating
대상이 방출되었을 때 호출된objcclear_deallocating 함수:
1. weak표에서 폐기된 대상의 주소가 키 값이라는 기록을 얻습니다.기록에 포함된 모든 weak 수식자 변수의 주소를 nil 3.weak표에서 이 기록을 삭제합니다 4.인용 계수표에서 버려진 대상의 주소가 키 값인 기록을 삭제합니다
요약:
사실 Weak표는hash(해시)표이고 Key는weak가 가리키는 대상의 주소이며 Value는weak지침의 주소(이 주소의 값은 가리키는 대상지침의 주소) 수조이다.

열문 추천


2019 온사이트 iOS 면접문제 및 답안 요약!

좋은 웹페이지 즐겨찾기