Generische typeof für schwache selbst-Referenzen
Ich versuche herauszufinden, ein Weg, um typeof
zu erstellen, die einen schwachen Verweis auf self
für den Einsatz in Blöcken zu vermeiden, behalten Zyklen.
Als ich zum ersten Lesen über diese, es scheint, dass das übereinkommen zu nutzen, um die __block typeof(self) bself = self;
die kompiliert, aber mit __block
zu vermeiden, behalten Zyklen nicht mehr funktioniert und __weak
sollte stattdessen verwendet werden.
Jedoch __weak typeof(self) bself = self;
führt zu einem Fehler:
Der Typ typeof (self)' (aka 'TUAccountsViewController *const __stark") hat bereits retainment Attribute festgelegt
Gibt es eine Möglichkeit zu nutzen typeof
oder anderen Anruf zu generisch erstellen Sie einen schwachen Verweis auf self
?
InformationsquelleAutor der Frage keegan3d | 2012-06-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der aktuellen clang-version Apple clang version 4.0 (tags/Apple/clang-421.1.48) (basierend auf LLVM 3.1 svn)d.h. Xcode 4.4+die
__typeof__((__typeof__(self))self)
trick ist nicht mehr notwendig. Die__weak typeof(self) bself = self;
Zeile kompilieren wird just fine.InformationsquelleAutor der Antwort 0xced
Dieser funktioniert!
Welche ich definiert habe in meinem BBlock Projekt als
BBlockWeakSelf
die verwendet werden können, wie diese:https://github.com/kgn/BBlock/blob/master/BBlock.h
Bearbeitet, basierend auf Aleph7 Antwort.
InformationsquelleAutor der Antwort keegan3d
Den richtigen Weg, dies zu tun ist
Makros nur unklar machen, was die variable eigentlich ist, und was Sie tatsächlich damit machen, zusätzlich zu nicht-portable meta-Sprache, um Ihren code.
Wenn Sie brauchen eine generische version der Klasse als ActualClassName bietet, Sie sind nicht der Umgang mit
self
mehr, da, woself
definiert ist, so ist die Klasseself
definiert.In diesen Fällen sollten Sie den nächsten base-class-Namen im vererbungsbaum,
NSObject
oder besser, nieid
z.B.InformationsquelleAutor der Antwort Brane
Generic Weakself Bezug (Kein Import Erforderlich + Snippet)
Meiner Erfahrung nach ist der Weg zu gehen ist zu verwenden:
__typeof__(self) __weak weakSelf = self;
Beachten Sie, wie das Eigentum qualifier gehört vor die eigentliche variable.
Es ist sehr offensichtlich, was passiert, wenn es verwendet wird, und es kann gemacht werden in eine praktische code-snippets in Xcode das macht es noch einfacher zu verwenden in jedem Projekt oder die Klasse, wo dies notwendig ist. (Ich benutze "ws", wie die snippet-Ende-Verknüpfung)
Hmm.. ich brauche einen schwachen Verweis hier..
ws{return}
Getan. Keine Notwendigkeit, immer auch eine Kopfzeile in Zukunft Projekte für dieses, verwenden Sie einfach das snippet.
Xcode Snippet
Titel:
Generic Weak Self Reference
Plattform:
All
Sprache:
Objective-C
Abschluss-Verknüpfung:
ws
Fertigstellung Bereiche:
Function or Method
Code:
__typeof__(self) __weak weakSelf = self;
Edit: zusätzlicher Hinweis über das Eigentum qualifier-position basierend auf Kommentareund Xcode Snippet Info
InformationsquelleAutor der Antwort Thuggish Nuggets
warum nicht einfach
InformationsquelleAutor der Antwort Denis Mikhaylov
ich denken, verwenden Sie diese, um ok zu sein:
__schwach __typeof(&*selbst -) weakSelf = self;
es Referenz AFNetworking ist AFURLConnectionOperation.m-codes.
InformationsquelleAutor der Antwort kitsionchen
Ich hatte einen ähnlichen Fehler, aber ich fixe es anders:
Ging ich zu Projekt-Navigator -> Projekt -> Ziel -> Build-Einstellungen
Dort sah ich für die C-Sprache-Dialekt. Ich änderte es von c11 zu GNU99 und es ist mein problem gelöst.
Ich hoffe, es hilft 🙂
InformationsquelleAutor der Antwort Ricardo Anjos
declareBlockSafe( selbst -) dann blk( self ) innerhalb des Blocks. Selbst kann eine beliebige variable oder Instanz-variable. Verwenden declareBlockSafeAs für die Eigenschaften und Methode gibt.
Funktioniert auch mit non-ARC wenn Sie den import Mike Ash herrlichen MAZeroingWeakRef.
https://github.com/mikeash/MAZeroingWeakRef
#if __has_feature(objc_arc)
Die Sie nicht WIRKLICH brauchen blk() für ARC, es ist einfach so, dass die Makros können verwendet werden in der gleichen Weise für nicht-ARC.
InformationsquelleAutor der Antwort SeruK
Habe ich dieses makro
Und ich benutze es so
InformationsquelleAutor der Antwort Maciej Swic
Was über __unsafe_unretained? Das ist nicht so sicher, wie __schwach, aber es ist das einzige, was ich denken konnte. Außerdem, warum verwenden Sie typeof()?
InformationsquelleAutor der Antwort lbrndnr