1

'objc_setAssociatedObject'를 사용하여 개체/키를 NSObject에 연결 한 다음 'objc_getAssociatedObject'를 호출하면이 것이 안전합니까?associatedValueForKey, 인식 할 수없는 키

시뮬레이터에서 테스트 한 결과 크래시가 발생하지 않지만 확실하게 알고 싶습니다.

그리고는 전화를 걸 때 :

objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN); 

내 NSObject의이 dealloc'd 때 내 NSObject의와 연관 객체가 해제 얻을합니까? (저는 ARC를 사용하고 있습니다).

+0

ARC가 작동하는 방식을 감안할 때, ARC는'objc_setAssociatedObject'를'nil' 또는'objc_removeAssociatedObjects'와 함께 삽입 할 것 같지 않습니다. 왜냐하면 그 호출을 어디에 둘 것인지 모르기 때문입니다. 그러나 나는 문서에서 확실한 답을 찾을 수 없었다. – FluffulousChimp

답변

4

연관성이없는 경우 objc_getAssociatedObjectnil을 반환합니다.

개체를 연결할 때 마지막 인수에서 제공된 의미를 사용합니다. 예를 들어 OBJC_ASSOCIATION_RETAIN은 개체가 유지되므로 연결이 해제되어있는 동안에는 할당이 취소되지 않습니다.

연관을 유지하는 객체 (objc_setAssociatedObject의 첫 번째 매개 변수)가 deallocs를 삭제하면 연결이 끊어집니다. 연결이 끊어지면 유지 된 개체가 해제됩니다 (시작 부분이 유지 된 경우).

따라서, 귀하의 예를 들면 다음과 같습니다 협회가 파괴 될 때까지

objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN); 

value이 유지 될 것이다. self deallocs 또는 연결이 다른 objc_setAssociatedObject으로 변경되면 연결이 끊어집니다.

관련 문제