Kann ich mit Objective-C-blocks als Eigenschaften?
Ist es möglich, Blöcke als Eigenschaften, die über die standard-Eigenschaft syntax?
Gibt es änderungen für ARC?
InformationsquelleAutor der Frage gurghet | 2010-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie gehen, um die Wiederholung der gleichen block an mehreren stellen verwenden Sie eine type def
InformationsquelleAutor der Antwort Robert
Hier ist ein Beispiel, wie Sie erledigen würde, solch eine Aufgabe:
Nun, das einzige, was müsste sich ändern, wenn Sie benötigt, um zu ändern, welche Art von Vergleich würden die
typedef int (^IntBlock)()
. Wenn Sie brauchen, um passieren Sie zwei Objekte, ändern Sie diese:typedef int (^IntBlock)(id, id)
und ändern Sie den block, um:Ich hoffe, das hilft.
BEARBEITEN 12. März 2012:
Für das ARC gibt es keine besonderen änderungen erforderlich, wie ARC verwalten Sie die Blöcke für Sie, solange Sie sind definiert als Kopie. Sie brauchen nicht, um die Eigenschaft zu-null in Ihrem Destruktor.
Für weitere Informationen, überprüfen Sie bitte aus diesem Dokument:
http://clang.llvm.org/docs/AutomaticReferenceCounting.html
InformationsquelleAutor der Antwort Richard J. Ross III
Schnelle, verwenden Sie einfach Verschlüsse: Beispiel.
In Objective-C,
@property (copy)void (^doStuff)(void);
So einfach ist das.
Apple-Dokumentation, vollständig zu erklären, dieses Problem:
Apple doco.
In Ihr .h-Datei:
Hier ist Ihr .m-Datei:
Hüten Sie sich vor out-of-date-Beispiel-code.
Mit modernen (2014+) - Systemen, zu tun, was hier gezeigt wird. Es ist so einfach. Hoffe, es hilft jemand. Frohe Weihnachten 2013!
InformationsquelleAutor der Antwort Fattie
Für die Nachwelt /der Vollständigkeit halber... Hier sind zwei VOLLSTÄNDIGE Beispiele, wie die Umsetzung dieser unglaublich vielseitigen "Weg, Dinge zu tun". @Robert, die Antwort ist herrlich präzise und korrekt, aber ich will hier auch Möglichkeiten aufzeigen, um tatsächlich "definieren" Sie die Blöcke.
Dumm? Ja. Nützlich? Hells yeah. Hier ist ein anderes, ein "mehr von atomic" Weg von der Einstellung der Eigenschaft.. und eine Klasse, die unglaublich nützlich...
Diese Einstellung zeigt die block-Eigenschaft, die über den accessor (wenn auch im inneren init, strittigerweise heikel Praxis..) gegen das erste Beispiel ist "nonatomic" "getter" - Mechanismus. In jedem Fall... die "hardcoded" - Implementierungen können immer überschrieben werden, pro Instanz.. a lá..
Auch.. wenn Sie hinzufügen möchten ein block-Eigenschaft in eine Kategorie... sagen Sie, Sie wollen verwenden Sie einen Block, anstatt einige old-school-Ziel /Aktion "action"... Sie können einfach verwenden Sie die zugehörigen Werte an.. ordnen Sie die Blöcke.
Nun, wenn Sie eine Schaltfläche, die Sie nicht haben, um einige
IBAction
drama.. Nur assoziieren die Arbeit bei der Erstellung...Dieses Muster angewendet werden kann über und ÜBER, um Kakao-API. Verwenden Sie Eigenschaften, um die relevanten Teile des Codes näher zusammenbeseitigen gewundenen delegation Paradigmenund nutzen Sie die power von Objekten, darüber hinaus nur als dumme "Container".
InformationsquelleAutor der Antwort Alex Gray
Natürlich könnten Sie Blöcke als Eigenschaften. Aber stellen Sie sicher, Sie sind deklariert als @property(copy). Zum Beispiel:
Im MRC, Blöcke Erfassung von Kontext-Variablen zugeordnet sind, in stack; Sie wird freigegeben, wenn der stack-frame zerstört wird. Wenn Sie kopiert werden, wird ein neuer block zugewiesen, in heapdie ausgeführt werden können, später, nachdem der stack-frame ist poped.
InformationsquelleAutor der Antwort Mindy
Disclamer
Dies ist nicht beabsichtigt zu sein, "die gute Antwort", als diese Frage explizit nachfragen, für ObjectiveC. Wie Apple hat Swift auf der WWDC14, ich möchte gerne die verschiedenen Möglichkeiten nutzen, um block (oder Verschlüsse) in Swift.
Hallo, Swift
Haben Sie viele Möglichkeiten angeboten, um pass ein block entspricht Funktion in Swift.
Fand ich drei.
Um das zu verstehen, schlage ich vor, Sie zu testen, Spielplatz dieses kleine Stück code.
Swift, optimiert für Verschlüsse
Als Swift ist optimiert für die asynchrone Entwicklung, Apple gearbeitet, mehr auf die Verschlüsse.
Die erste ist, dass die Funktion Signatur abgeleitet werden kann, so dass Sie nicht haben, um zu schreiben.
Access params durch zahlen
Params Inferenz mit Benennung
Nachfolgende Schließung
Diesem speziellen Fall funktioniert nur, wenn der block das Letzte argument, es heißt nachfolgende Schließung
Hier ist ein Beispiel (gemischt mit abgeleitet Unterschrift, um zu zeigen, Swift macht)
Schließlich:
Mit all dieser macht, was ich tun würde, ist das mischen nachfolgende Schließung und Typ-Inferenz (mit Namensgebung für die Lesbarkeit)
InformationsquelleAutor der Antwort Francescu
Hallo, Swift
Ergänzend zu dem was @Francescu beantwortet.
Hinzufügen zusätzlicher Parameter:
InformationsquelleAutor der Antwort Gil Beyruth
Können Sie die format unten und kann die
testingObjectiveCBlock
Eigenschaft in der Klasse.Für mehr info schauen Sie hier
InformationsquelleAutor der Antwort Sujith Thankachan