Antworten:
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.
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.
-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)