ARC zabrania obiektów Objective-C w strukturach lub związkach pomimo zaznaczenia pliku -fno-objc-arc

85

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.

Zsolt
źródło

Odpowiedzi:

170

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;
zeiteisen
źródło
4
powoduje również problemy, gdy przydzielam ciąg, pokazuje ostrzeżenie przypisanie zachowanego obiektu do unsafe_unretained zmienny obiekt zostanie zwolniony po przypisaniu. A kiedy go używam, zawiesza się
Deepak Singh Negi
8
To nie rozwiązuje wszystkich problemów, normalnie obiekt zostałby natychmiast zwolniony i przez to niedostępny.
Diziet
tak - to właściwie nie działa ... rozwiązaniem jest jakoś wyłączyć ARC dla pochodnego pliku źródłowego, którego jeszcze nie byłem w stanie
rozgryźć
1
Robisz to, dodając flagę -fno-objc-arc do pliku w fazie budowania.
Abizern
A co, jeśli pole struct jest tylko „głupim odniesieniem”, a obiekt jest faktycznie przechowywany (posiadany) w innym miejscu (powiedzmy, wewnątrz NSArray)? W takim przypadku nie zostanie natychmiast zwolniony, ale zastanawiam się, co powie kompilator (nie mogę tego teraz przetestować) ...
Nicolas Miari
30

Zamiast używać struktury , możesz zamiast tego utworzyć klasę Objective-C do zarządzania danymi.

János
źródło
w jaki sposób? gdzie jest próbka?
Dlaczego więc nie można stworzyć struktury dla małych przypadków użycia?
Devanshu Saini
13

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.

voidStern
źródło
Ale potem, jak mogę używać plików arc i non-arc w moich projektach. Na przykład używam sharekit jako non-arc i mogę używać instancji do publikowania. Pliki, których używam, to pliki arc.
Zsolt
Możesz używać -fno-objc-arcdo 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.
voidStern
Dzięki voidStern .. "ale jeśli używasz zwykłych struktur C, takich jak struct lub union, gdziekolwiek nie możesz w ogóle używać ARC." - Nie sądzę, żeby to była prawda. Używam ARC do moich własnych plików. I nie-arc dla plików libharu. Sposób, w jaki obejrzałem mój pierwotny problem, polegał na osobnym przekazaniu wartości do pliku C i utworzeniu tam struktury. Myślę, że kluczem jest przejście od łuku do nie-łuku do łuku.
Zsolt,
1
To wszystko może być trochę przesadzone. W istocie nie można wstawiać wskaźników do obiektów w struktury i związki, co mogłoby zmylić ARC. Używanie zwykłej biblioteki C ze strukturami i / lub uniami powinno (zwykle) być możliwe.
voidStern
6

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)

Hiroshi Ichikawa
źródło
2
Co nowego w LLVM - WWDC 2018
Mr. Ming