report 대리인이 약한 대신에 할당을 사용하면 응용 프로그램이 충돌하는 것으로 나타났습니다. 왜?대리인이 약한 대신에 할당을 사용하는 경우 왜 앱이 다운 되나요?
예 : RestKit 아이바 객체가 해제 될 때 weak
아이바 nil
자동으로 설정한다 아크
report 대리인이 약한 대신에 할당을 사용하면 응용 프로그램이 충돌하는 것으로 나타났습니다. 왜?대리인이 약한 대신에 할당을 사용하는 경우 왜 앱이 다운 되나요?
예 : RestKit 아이바 객체가 해제 될 때 weak
아이바 nil
자동으로 설정한다 아크
. 즉, 위임자가 파기되고 위임자에게 메시지를 보내려고하면 아무 효과가 없다는 메시지 만 표시됩니다. 델리게이트 ivar가 단지 assign
이라면 더 이상 유효한 객체를 포함하지 않는 메모리 조각을 메시지로 보냅니다.
오른쪽. 코코아 전문 용어로 _dangling pointer_라고도 알려져 있습니다. – tompave
assign
과 weak
의 유일한 차이점은 약한 것이 일반적인 충돌 버그를 피하기 위해 추가 작업을한다는 것입니다. 그러나 단점은 assign
이 weak
보다 훨씬 뛰어난 성능을 제공한다는 것입니다.
특히, 개체가 해제되면이 개체를 가리키는 weak
속성이 nil
으로 설정됩니다. 이를 가리키는 모든 assign
속성은 더 이상 사용되지 않는 개체를 가리 키도록 남게됩니다.
그리고 다른 객체는 이전 객체와 동일한 위치에 배치 될 가능성이 있으므로 갑자기 MyDelegate
대신에 UIImage
객체가 메모리의 같은 위치에 있거나 부동 소수점 값을 가질 수 있습니다 , 또는 전혀.
항상 weak
을 사용해야합니다. 그러나 성능 문제가 발생하면 weak
이 원인인지 확인하고 버그가 발생하지 않도록하는 방법을 학습 한 후 assign
으로 전환하는 것이 좋습니다.
대리인의 경우 항상 weak
을 사용해야합니다. 일반적으로 수백만 개의 개체를 다루는 경우에만 assign
을 선택합니다. 일반적으로 대리인에게는 발생하지 않습니다.
객체가 할당 해제되면 이전에 할당 해제 된 객체 ("dangling pointer")에 대한 포인터를'assign'이 가지고 있기 때문에'weak'를 사용하면 객체가 할당 해제 될 때 포인터가'nil'으로 설정됩니다 . – Rob