ARC zabrania obiektów Objective-C w strukturach lub związkach pomimo zaznaczenia pliku -fno-objc-arc? Dlaczego tak jest?
Przyjąłem założenie, że jeśli oznaczysz to -fno-objc-arc, nie masz tego ograniczenia.
Odpowiedzi:
Jeśli otrzymałeś tę wiadomość, spróbuj __unsafe_unretained. Jest to bezpieczne tylko wtedy, gdy obiekty w strukturze nie są zachowane. Przykład: Jeśli używasz OpenFeint z ARC, klasa OFBragDelegateStrings mówi o tym błędzie w strukturze.
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
do
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
NSArray
)? W takim przypadku nie zostanie natychmiast zwolniony, ale zastanawiam się, co powie kompilator (nie mogę tego teraz przetestować) ...
Zamiast używać struktury , możesz zamiast tego utworzyć klasę Objective-C do zarządzania danymi.
Dzieje się tak, ponieważ arc nie może śledzić obiektów w strukturach lub związkach (ponieważ w tym momencie są to zwykłe wskaźniki C).
Nawet jeśli oznaczyłeś plik / klasę, o której mowa -fno-objc-arc
, nadal możesz przekazać do niego obiekt kontrolowany przez arc jako parametr, co najprawdopodobniej spowodowałoby wyciek pamięci.
-fno-objc-arc
do mieszania plików ARC i innych niż ARC w projekcie, ale jeśli używasz zwykłych struktur C, takich jak struct lub union, gdziekolwiek nie możesz używać ARC.
Wygląda na to, że teraz działa bez błędów, prawdopodobnie po tej zmianie .
tj. możesz umieścić normalne (mocne) wskaźniki do obiektów Objective-C w strukturze C. Jest zarządzany przez ARC, np. Nie jest zatrzymywany po zniszczeniu struktury. Zweryfikowano przez:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)