2017-12-05 1 views

Antwort

2

Zwei Gründe:

  1. __weak funktioniert nur im ARC-Code und die JRE Emulationsbibliothek mit ARC aufgrund einer spürbaren Leistungs Kosten nicht gebaut.

  2. In Ziel C kann man testen, ob ein __schwäches Feld freigegeben wurde, indem man testet, ob es Null ist. Da es für normale Referenzen keine Möglichkeit gibt, dies in Java zu tun, ist der von diesem Verhalten abhängige Code plattformabhängig (dh er funktioniert unter Android nicht gleich).

J2ObjC unterstützt die java.lang.reflect Paket, wenn Sie also eine plattformübergreifende Art und Weise der Verwendung von schwachen Referenzen möchten, verwenden Sie WeakReference statt @Weak.

+0

Danke! Ich dachte, dass Javas "WeakReference" als "__week" übersetzt werden würde, aber finde heraus, dass es die übersetzte 'java/lang/ref/WeakReference' Klasse benutzt. Ich schaue in die Quelle der übersetzten 'WeakReference', finde aber nichts wie' __weak', wie funktioniert es unter ARC? (Ich habe eine Zyklusreferenz und muss 'weak' verwenden, um sie zu brechen) – Piasy

+0

Eine __unsafe_unretaent-Annotation löst einen Referenzzyklus auf, weshalb j2objc @Weak dorthin übersetzt. Der einzige Unterschied __unsafe_unreadyed und __weak ist, dass letzterer auch das Feld auf Null setzt, wenn die Instanz deallociert wird. Das ist kein Problem für übersetzten Code, da der Compiler keine Verweise auf die Felder der Instanz zulassen darf, wenn eine Instanz deallociert wird. Wenn Sie das Feldverhalten in Ihrem Code auf Null setzen müssen, verwenden Sie eine java.lang.ref.WeakReference. – tball

+0

Danke für Ihre Antwort! Ich habe zu 'java.lang.ref.WeakReference' gewechselt, aber ich bin ein bisschen neugierig, wie funktioniert die übersetzte' java.lang.ref.WeakReference' in objc, benutzt sie '__weak' intern? – Piasy

Verwandte Themen