Viele Posts scheinen von Benachrichtigungen abzuweichen, wenn versucht wird, Funktionen zu synchronisieren, aber es gibt auch andere Posts, die davor warnen, Callbacks zu schließen, weil sie versehentlich Objekte behalten und Speicherprobleme verursachen können.Bedenken hinsichtlich des Speichers bei der Wahl zwischen Benachrichtigung und Rückruf bei Netzwerkanrufen?
In einer benutzerdefinierten Ansicht Controller ist eine Funktion foo
, die die Klasse Bar
verwendet, um Daten vom Server zu erhalten.
class CustomViewController : UIViewController {
function foo() {
// Do other stuff
// Use Bar to get data from server
Bar.getServerData()
}
}
Option 1:getServerData
definieren einen Rückruf zu akzeptieren. Definieren Sie den Rückruf als einen Abschluss innerhalb CustomViewController
.
Option 2: Verwenden Sie NSNotifications
anstelle eines Rückrufs. Geben Sie in getServerData
einen NSNotification
ein, wenn der Server Daten zurückgibt, und stellen Sie sicher, dass CustomViewController
für die Benachrichtigung registriert ist.
Option 1 scheint aus allen Gründen wünschenswert, die Menschen vor NSNotification
warnen (z. B. Compiler-Prüfungen, Rückverfolgbarkeit), aber kein Callback verursacht ein potenzielles Problem, bei dem CustomViewController
unnötigerweise beibehalten wird und daher möglicherweise Speicherprobleme entstehen?
Wenn ja, ist der richtige Weg, um das Risiko zu mindern, indem Sie einen Rückruf verwenden, aber keine Schließung verwenden? Mit anderen Worten: Definieren Sie eine Funktion innerhalb von CustomViewController
mit einer Signatur, die dem getServerData
Callback entspricht, und übergeben Sie den Zeiger an diese Funktion an getServerData
?
IMHO, beide sind gültige Ansätze. Option 1 ist viel prägnanter, verständlicher und leichter zu korrigieren. Daher wird Option 1 bevorzugt. Es scheint jedoch, dass Sie durch andere Antworten fehlgeleitet sind: Speicherverwaltung und Synchronisierung sind orthogonale Konzepte und haben ihre eigenen Probleme. – CouchDeveloper