ARC verbietet Objective-C-Objekte in Strukturen oder Vereinigungen, obwohl die Datei -fno-objc-arc markiert ist

85

ARC verbietet Objective-C-Objekte in Strukturen oder Gewerkschaften, obwohl die Datei -fno-objc-arc markiert ist. Warum ist das so?

Ich ging davon aus, dass Sie diese Einschränkung nicht haben, wenn Sie sie als -fno-objc-arc markieren.

Zsolt
quelle

Antworten:

170

Wenn Sie diese Nachricht erhalten haben, versuchen Sie __unsafe_unretained. Es ist nur sicher, wenn die Objekte in der Struktur nicht beibehalten werden. Beispiel: Wenn Sie OpenFeint mit ARC verwenden, sagt die Klasse OFBragDelegateStrings diesen Fehler in einer Struktur.

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

zu

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
zeiteisen
quelle
4
Es verursacht auch Probleme, wenn ich die Zeichenfolge zuweise. Es zeigt eine Warnung, dass das Zuweisen eines beibehaltenen Objekts zu einem unsicheren_unretained Variablenobjekt nach der Zuweisung freigegeben wird. Und wenn ich es benutze, stürzt es ab
Deepak Singh Negi
8
Dies löst nicht alle Probleme, das Objekt wird normalerweise sofort freigegeben und ist daher nicht verfügbar.
Diziet
ja - das funktioniert eigentlich nicht ... die lösung besteht darin, ARC für eine abgeleitete quelldatei irgendwie auszuschalten, die ich noch nicht herausfinden konnte ...
nielsbot
1
Dazu fügen Sie der Datei in der Erstellungsphase das Flag -fno-objc-arc hinzu.
Abizern
Was ist, wenn das Strukturfeld nur eine "dumme Referenz" ist und das Objekt tatsächlich an einem anderen Ort (z. B. in einem NSArray) aufbewahrt wird? In diesem Fall wird die Zuordnung nicht sofort aufgehoben, aber ich frage mich, was der Compiler sagen wird (kann es derzeit nicht testen) ...
Nicolas Miari
30

Anstatt eine Struktur zu verwenden , können Sie stattdessen eine Objective-C-Klasse erstellen , um die Daten zu verwalten.

János
quelle
Wie? Wo ist die Probe?
Warum kann nicht für kleine Anwendungsfälle strukturiert werden?
Devanshu Saini
13

Dies liegt daran, dass arc keine Objekte in Strukturen oder Vereinigungen verfolgen kann (da es sich an diesem Punkt um einfache C-Zeiger handelt).

Auch wenn Sie die betreffende Datei / Klasse mit markiert haben, übergeben Sie -fno-objc-arcihr möglicherweise ein von arc gesteuertes Objekt als Parameter, was höchstwahrscheinlich zu einem Speicherverlust führen würde.

voidStern
quelle
Aber wie kann ich dann Arc- und Nicht-Arc-Dateien in meinen Projekten verwenden? Zum Beispiel verwende ich Sharekit als Nicht-Arc und kann Instanzen zum Veröffentlichen verwenden. Die Dateien, die ich benutze, sind Arc-Dateien.
Zsolt
Sie können -fno-objc-arcARC- und Nicht-ARC-Dateien innerhalb eines Projekts mischen. Wenn Sie jedoch einfache C-Strukturen wie struct oder union überall verwenden, können Sie ARC überhaupt nicht verwenden.
voidStern
Danke voidStern .. "aber wenn Sie überall einfache C-Strukturen wie struct oder union verwenden, können Sie ARC überhaupt nicht verwenden." - Ich denke nicht, dass das wahr ist. Ich verwende ARC für meine eigenen Dateien. Und nicht für die libharu-Dateien. Die Art und Weise, wie ich mein ursprüngliches Problem umging, bestand darin, die Werte separat an die C-Datei zu übergeben und dort die Struktur zu erstellen. Ich denke, der Schlüssel ist der Sprung von Bogen zu Nicht-Bogen zu Bogen.
Zsolt
1
Überhaupt etwas übertrieben. Im Wesentlichen können Sie keine Zeiger auf Objekte in Strukturen und Vereinigungen einfügen, was ARC verwirren würde. Die Verwendung einer einfachen C-Bibliothek mit Strukturen und / oder Gewerkschaften sollte (normalerweise) möglich sein.
voidStern
6

Sieht so aus, als ob dies jetzt fehlerfrei funktioniert, wahrscheinlich nach dieser Änderung .

Das heißt, Sie können normale (starke) Zeiger auf Objective-C-Objekte in einer C-Struktur setzen. Es wird von ARC verwaltet, z. B. wird es nicht beibehalten, wenn die Struktur zerstört wird. Verifiziert mit:

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)

Hiroshi Ichikawa
quelle
2
Was ist neu in LLVM - WWDC 2018
Mr. Ming