2014-04-15 2 views
0

report 대리인이 약한 대신에 할당을 사용하면 응용 프로그램이 충돌하는 것으로 나타났습니다. 왜?대리인이 약한 대신에 할당을 사용하는 경우 왜 앱이 다운 되나요?

예 : RestKit 아이바 객체가 해제 될 때 weak 아이바 nil 자동으로 설정한다 아크

+0

객체가 할당 해제되면 이전에 할당 해제 된 객체 ("dangling pointer")에 대한 포인터를'assign'이 가지고 있기 때문에'weak'를 사용하면 객체가 할당 해제 될 때 포인터가'nil'으로 설정됩니다 . – Rob

답변

2

. 즉, 위임자가 파기되고 위임자에게 메시지를 보내려고하면 아무 효과가 없다는 메시지 만 표시됩니다. 델리게이트 ivar가 단지 assign이라면 더 이상 유효한 객체를 포함하지 않는 메모리 조각을 메시지로 보냅니다.

+0

오른쪽. 코코아 전문 용어로 _dangling pointer_라고도 알려져 있습니다. – tompave

-1

assignweak의 유일한 차이점은 약한 것이 일반적인 충돌 버그를 피하기 위해 추가 작업을한다는 것입니다. 그러나 단점은 assignweak보다 훨씬 뛰어난 성능을 제공한다는 것입니다.

특히, 개체가 해제되면이 개체를 가리키는 weak 속성이 nil으로 설정됩니다. 이를 가리키는 모든 assign 속성은 더 이상 사용되지 않는 개체를 가리 키도록 남게됩니다.

그리고 다른 객체는 이전 객체와 동일한 위치에 배치 될 가능성이 있으므로 갑자기 MyDelegate 대신에 UIImage 객체가 메모리의 같은 위치에 있거나 부동 소수점 값을 가질 수 있습니다 , 또는 전혀.

항상 weak을 사용해야합니다. 그러나 성능 문제가 발생하면 weak이 원인인지 확인하고 버그가 발생하지 않도록하는 방법을 학습 한 후 assign으로 전환하는 것이 좋습니다.

대리인의 경우 항상 weak을 사용해야합니다. 일반적으로 수백만 개의 개체를 다루는 경우에만 assign을 선택합니다. 일반적으로 대리인에게는 발생하지 않습니다.

관련 문제