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.

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;

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.


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.


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)


2
Co nowego w LLVM - WWDC 2018
— Mr. Ming
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.