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.
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.
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;
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) ...Anstatt eine Struktur zu verwenden , können Sie stattdessen eine Objective-C-Klasse erstellen , um die Daten zu verwalten.
quelle
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-arc
ihr möglicherweise ein von arc gesteuertes Objekt als Parameter, was höchstwahrscheinlich zu einem Speicherverlust führen würde.quelle
-fno-objc-arc
ARC- 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.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)
quelle