6

Ich habe eine App (nur ios5), die innerhalb einer Methode eine schwache Variable deklariert, die innerhalb eines Blocks verwendet wird, um auf eine Instanz von zu verweisen ein View-Controller.Objective-C ARC __schwache Variablenreferenz löst Warnung aus "__schwäches Attribut kann nicht für eine automatische Variable angegeben werden"

QRCodeViewController * __weak weakSelf = self; 

Das Problem ist, dass der Compiler eine Warnung zeigt den Worten:

__weak Attribut kann nicht auf eine automatische Variable

In dieser Anmeldung angegeben werden, ich habe eine Menge schwache Verweise verwendet haben und ich habe nie eine Warnung gesehen, der einzige Unterschied zu den anderen Klassen ist, dass diese Klasse in einer .mm-Datei implementiert ist, da sie ein C++ - Objekt verwendet und das Projekt nicht kompilieren kann, wenn ich es als .m belasse.
Ich muss sagen, dass der Code scheint gut zu funktionieren.
Irgendwelche Vorschläge?

+0

Sollte es nicht sein '__weak QRCodeViewController * weakSelf = self;'? –

+2

@Martin funktioniert entweder, sie sind gleichwertig, dein Weg ist der, den ich häufiger benutze, aber Andreas Weg ist derjenige, der von Apple empfohlen wird. –

+0

Ähnliche Fragen: http://stackoverflow.com/questions/10431110/nested-blocks-and-references-to-self. Antwort war, dass das Implementierungsziel auf 4.0 gesetzt wurde, aber das ist nicht der Fall für Sie. Richtig? –

Antwort

4

diese gleiche Warnung Facing ich es verschwinden zu lassen, eine __block mit Attribut die folgende Art und Weise:

__block __weak MyViewController* weakSelf = self; 
+0

Nun, es funktioniert !!!! – Andrea

0

Ich bin mir nicht sicher, warum die Warnung besagt, dass __weak nicht angegeben werden kann. AFAIK sollte es möglich sein, es zu spezifizieren, selbst wenn es sehr gefährlich ist, __weak für automatische Variablen zu verwenden.

Apple-Dokumentation sagt, dass der Compiler eine Warnung zur Verfügung stellen, wenn Sie das tun, aber der tatsächliche Warnung Text scheint zu implizieren, dass das Attribut nicht nur ignoriert werden wird, dass die Verwendung es gefährlich ist, während die Dokumentation scheint zu implizieren, dass es gefährlich, aber es funktioniert wie erwartet (wenn Sie wirklich verstehen, was zu erwarten ist).

Sie müssen experimentieren, um zu überprüfen, ob der Warnungstext unpassend ist oder ob die Dokumentation nicht korrekt aktualisiert wurde.

+0

Hi Analoge Datei, danke für Ihre Antwort, die Tatsache ist, dass es normal ist, schwache Referenzen für Objekte zu erzeugen, die Sie an einen Block übergeben wollen, um Retain-Zyklen zu vermeiden. Ich habe es unzählige Male ohne Vorwarnung in meinem Code getan. Ich stimme zu, dass schwach für eine automatische Variable gefährlich ist, oder besser ist ein Unsinn, denn wenn Sie in einem Block für asynchronen Prozess verwenden, ist die Variable weg, da sie keinen starken Bezug darauf hat. Aber hier gebe ich self zu, das keine automatische Variable ist und stark durch die Existenz der Klasse referenziert wird. – Andrea

+0

Es ist kein Unsinn. Wie Sie sagen, es hat durchaus vernünftige Anwendungsfälle. Aber es ist gefährlich. Ihr asynchrones Blockbeispiel ist genau richtig (viele Leute hätten Probleme zu verstehen, warum es nicht funktioniert). Das ist der Grund für die Wahl von Apple, es legal zu machen und dennoch eine Warnung auszuspucken.Wenn du verifiziert hast, dass es funktioniert, denke ich, dass das Problem hauptsächlich in dem Warnungstext liegt, nicht in der Tatsache, dass du die Warnung bekommst (was eine bewusste Entscheidung der Compiler-Entwickler gemäß den Dokumenten ist). Deshalb ist es auch nur eine Warnung, auch wenn es als Fehler formuliert ist. –

+1

@AnalogFile: Haben Sie einen Verweis auf die Apple-Dokumentation, wo der Compiler eine Warnung ausgibt, wenn __weak mit automatischen Variablen verwendet wird? Vielen Dank! –