Wyłącz automatyczne zliczanie odniesień dla niektórych plików

183

Pobrałem SDK dla systemu iOS 5 i odkryłem, że ARC to świetna funkcja nowego kompilatora Apple. Na razie wiele platform zewnętrznych nie obsługuje ARC. Czy mogę użyć ARC do mojego nowego kodu i zachować bieżący kod zatrzymania / zwolnienia bez zmian? Konwerter ARC nie działa tutaj, ponieważ niektóre frameworki, takie jak JSONKit, nie mogą zostać przekonwertowane na ARC za pomocą konwertera.

Edytować:

Odpowiedzią jest dodanie -fno-objc-arcdo flag kompilatora plików, których nie chcesz ARC. W Xcode 4 możesz to zrobić pod swoim celem -> Fazy kompilacji -> Kompiluj źródła.

niemiły
źródło
2
Aby to wyjaśnić, wystarczy dodać go do .mpliku. Nie .hplik.
ma11hew28,
Znalazłem tę rozmowę: github.com/gowalla/AFNetworking/issues/36 Może to pomóc komuś, jak zintegrować JSONKit w projekcie obsługiwanym przez ARC iOS5 ;-) Ale w tej chwili nie próbowałem ...
Ta metoda działała dla mnie. Dodałem AsyncUdpSocket dla UDP Multicast do mojego projektu i te pliki [przynajmniej bieżąca wersja] NIE obsługują ARC. Dlatego użyłem powyższej metody, aby dodać flagę kompilatora do pliku AsyncUdpSocket.m i mogę sprawić, że kod będzie działał poprawnie z moją aplikacją.
Ashu Joshi
2
To działa idealnie! Szczegóły: Przejdź do celu i wybierz Fazy budowy, a następnie Skompiluj źródła. Jeśli klikniesz dwukrotnie plik .m, o którym mowa, pojawi się okno, w którym możesz wpisać / wkleić: „-fno-objc-arc”
mpemburn

Odpowiedzi:

73

Publiczne dokumenty ARC , choć nie są jednoznaczne w tej kwestii, zdają się sugerować, że dopóki każda klasa jest w całości ARC lub zarządzana ręcznie, klasy mogą być zintegrowane w jednym programie.

Nie można mieszać ARC i innych niż ARC w jednej klasie; Dokument mówi, że wysyłanie retain, release, autorelease, lub retainCountwiadomości w jakikolwiek sposób (w tym timerów i opóźnionych preform, które używają @selector) jest zakazane w kodzie ARC. Nie możesz więc wykonywać operacji bez ARC w klasie ARC (ponieważ niezbędne wiadomości są zbanowane) i nie możesz wykonywać ARC w klasie innej niż ARC (ponieważ ARC dodaje elementy składniowe, które są niepoprawne bez ARC).

Ten sam dokument wyjaśnia, czy można zintegrować biblioteki / frameworki inne niż ARC z programem ARC: Tak. Nie wspomina, czy możesz używać bibliotek / frameworków ARC w programie, w którym cały twój kod nie jest ARC, ale biorąc pod uwagę wszystkie powyższe, implikacja wydaje się tak.

Peter Hosey
źródło
Dziękuję Ci! Nauczyłem się, jak wyłączyć ARC dla istniejących klas spoza ARC.
niemiły
Czy możesz podzielić się z nami tym, co robisz?
David H
1
@David H: Jeśli chciałbyś zwrócić się do pytającego, powinieneś zauważyć, że pytający zmodyfikował swoje rozwiązanie w pytaniu.
Peter Hosey
Kompilacji ARC nie można wyłączyć w plikach HEADER. Clang NIE skompiluje interfejsu / nagłówka na podstawie kompilacji pliku implementacji / metody. Dlatego pliki nagłówkowe muszą być kompatybilne zarówno z ARC, jak i bez ARC w kompilacji mieszanej. Uważam to za błąd w kompilatorze.
Carmin
1
@carmin: To nie jest. Kompilator nie patrzy na pliki nagłówkowe, z wyjątkiem sytuacji, w której użytkownik o to poprosi, co zwykle robi się tylko poprzez #importich pobranie z plików modułów. Ustawienie flag kompilatora dotyczy każdego pliku modułu (a dokładniej każdego pliku w fazie kompilacji „Źródła kompilacji”). Kompilator nie ma sposobu, aby dowiedzieć się, czy powinien używać ARC, czy nie dla żadnego innego pliku, poza dziedziczeniem wyboru, który został podany dla pliku modułu, z którym zaczął.
Peter Hosey
78

Nie jest bardzo intuicyjne, jak wyłączyć ARC na WIELU plikach, przez pewien czas robiłem to jeden po drugim, dopóki nie wymyśliłem, jak to zrobić.

  1. Wybierz żądane pliki w folderze Cel / Kompiluj / Kompiluj źródła w Xcode (CMD + kliknięcie lub Shift + kliknięcie)
  2. NACISNĄĆ ENTER (podwójne kliknięcie zresetuje zaznaczenie, więc nie działa)
  3. Wpisz -fno-objc-arc
  4. Naciśnij Enter lub Gotowe
Tibidabo
źródło
1
To naprawdę nie jest odpowiedź na zadane tutaj pytanie, ale i tak cholernie dobra wskazówka! Zagłosowano +1
Kristof Van Landschoot,
Masz rację, nie jest, ale zawsze szukałem przełącznika i ta odpowiedź jest jednym z największych hitów. Myślałem, że w dzisiejszych czasach większość ludzi zna już odpowiedź, ale nie tę „wskazówkę”
Tibidabo,
35

Jeśli chcesz wyłączyć automatyczne zliczanie odniesień dla niektórych plików, to bardzo proste jest po prostu wykonać następujące czynności. Dodajesz flagi kompilatora w Celach -> Fazy budowania -> Źródła kompilacji.

xcode

Użyta flaga to -fno-objc-arc naciśnij klawisz Enter po zapisaniu.! Musisz dwukrotnie kliknąć prawą kolumnę wiersza pod Flagi kompilatora. Mam nadzieję, że to pomaga Dzięki :)

Nikhil Bansal
źródło
14
Możesz użyć tej samej metody, aby włączyć ARC dla określonego pliku w projekcie innym niż ARC przy użyciu flagi -fobjc-arc.
lnafziger
Kompilacji ARC nie można wyłączyć w plikach HEADER. Clang NIE skompiluje interfejsu / nagłówka na podstawie kompilacji pliku implementacji / metody. Dlatego pliki nagłówkowe muszą być kompatybilne zarówno z ARC, jak i bez ARC w kompilacji mieszanej. Uważam to za błąd w kompilatorze.
Carmin