iOS 런타임 면접문제(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 면접문제 및 답안 요약!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.