Ich habe ernsthafte Zweifel. Angenommen, das folgende Szenario:
UIViewController
auf dem Bildschirm. UIViewController
wird freigegeben. Vor iOS 4 haben wir uns mit dieser Art von Situation beschäftigt, indem wir auf BAD ACCESS
die nil
-Eigenschaft von ... gesetzt haben. Ich weiß nicht, welche Klasse Sie auch verwenden.
Aber heutzutage ... wie stornierst du einen Block ??. Was ist, wenn der Block an eine statische Methode gesendet wurde und Sie keine Möglichkeit haben, diese Rückrufreferenz zu löschen?.
In diesem Fall sollten wir vermeiden, den "Selbst" -Surrogat zu verwenden?
Übrigens, mit "Selbstersatz" möchte ich sagen:
%Vor%Danke !!
Nun, zuerst einmal:
Wenn (und nur wenn) Ihr Grund dafür, die Verwendung von self
oder den direkten Zugriff von Ivars innerhalb eines Blocks zu vermeiden, wirklich Retain-Zyklen sind, sollten Sie sich in einer Situation wie
(wobei =>
bedeutet "hat einen starken Bezug auf").
In diesem Fall sollte blockWithWeakBackReference
immer nur von objectA
aufgerufen werden, daher besteht keine Gefahr eines SCHLECHTEN ZUGRIFFS.
Wenn ich Ihre Frage richtig verstanden habe, meinen Sie ein anderes Szenario:
objectA
möchte, dass ein anwendungsweiter Dienst einen Block in seinem Namen ausführt , wenn eine Vorbedingung erfüllt ist. self
innerhalb des Blocks, da Sie objectA
vor der Ausführung des Blocks ablegen möchten. Ein Beispiel hierfür könnte eine gemeinsam genutzte Netzwerkwarteschlange sein, die einen Block ausführt, wenn die Anforderung aus irgendeinem Grund beendet wurde.
In diesem Fall würde ich vorschlagen, einfach das Design von NSNotificationCenter
's addObserverForName:object:queue:usingBlock:
zu kopieren und Ihren Service dazu zu bringen, ein paar Methoden wie -(SomeTokenObjectType)addWorkerBlock:(void(^)(whatever-signature-makes-sense-for-you))
und -(void)cancelWorkerBlockWithToken:(SomeTokenObjectType)
zu implementieren, um Ihre Callback- Blöcke.
Dann können alle Objekte, die diesen Service verwenden, einfach einen ivar vom Typ NSMutableSet
haben, um das Token für jeden in die Warteschlange eingereihten Block zu speichern und - in ihrer dealloc
- die verbleibenden Tokens aufzulisten und sie mit dem Service zu löschen. p>
Tags und Links objective-c ios objective-c-blocks