2017-12-05 5 views

답변

2

두 가지 이유 :

  1. __weak는 ARC 코드에서 작동하며 JRE 에뮬레이션 라이브러리로 인해 성능이 현저하게 비용 ARC로 구축되어 있지 않습니다.

  2. Objective C에서 __weak 필드가 해제되어 있는지 여부를 테스트하여 테스트 할 수 있습니다. Java에서 일반적인 참조를 위해이를 수행 할 방법이 없으므로이 동작에 의존하는 코드는 플랫폼에 따라 다릅니다 (즉, Android에서도 동일하게 작동하지 않음).

는 J2ObjC는 java.lang.reflect 패키지를 지원하므로 약한 참조를 사용하는 크로스 플랫폼 방식을 원하는 경우, WeakReference를 대신 @Weak를 사용합니다.

+0

감사! 나는 자바의 WeakReference가'__week '로 번역 될 것이라고 생각했지만 번역 된'java/lang/ref/WeakReference' 클래스를 사용하고 있음을 알았다. 나는 번역 된'WeakReference'의 근원을 살펴 보지만'__weak'과 같은 것은 아무것도 발견하지 못합니다. ARC 하에서 어떻게 작동합니까? (사이클 레퍼런스를 가지고 있고 그것을 약화시키기 위해 'weak'을 사용해야합니다.) – Piasy

+0

__unsafe_unretained 주석은 레퍼런스 사이클을 해결합니다. 이것이 j2objc가 @Weak를 레퍼런스 사이클로 변환하는 이유입니다. __unsafe_unretained와 __weak의 유일한 차이점은 인스턴스가 dealloc 될 때 필드가 0이된다는 것입니다. 인스턴스가 dealloc 될 때 컴파일러는 인스턴스의 필드에 대한 참조를 허용해서는 안되기 때문에 번역 된 코드에서는 문제가되지 않습니다. 코드에서 필드 동작을 제로화해야한다면 java.lang.ref.WeakReference를 사용하십시오. – tball

+0

답변 해 주셔서 감사합니다! 나는'java.lang.ref.WeakReference'로 전환했지만,'java.lang.ref.WeakReference'가 어떻게 objc에서 작동하는지,'__weak'를 내부적으로 사용하는지 궁금합니다. – Piasy