web-dev-qa-db-de.com

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

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

Ich bin davon ausgegangen, dass Sie diese Einschränkung nicht haben, wenn Sie es -fno-objc-arc markieren.

85
Zsolt

Wenn Sie diese Nachricht erhalten haben, versuchen Sie es mit __unsafe_unretained. Es ist nur sicher, wenn die Objekte in der Struktur nicht zurückgehalten werden. Beispiel: Wenn Sie OpenFeint mit ARC verwenden, meldet 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;
171
zeiteisen

Eher als ein struct zu verwenden, können Sie stattdessen eine Objective-C-Klasse erstellen, um die Daten zu verwalten.

30
János

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 -fno-objc-arc Markiert haben, können Sie dennoch ein von arc gesteuertes Objekt als Parameter übergeben, was höchstwahrscheinlich zu einem Speicherverlust führen würde.

13
voidStern

Sieht so aus, als würde das jetzt fehlerfrei funktionieren, wahrscheinlich nach diese Änderung .

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)

5