2011-06-23 17 views
182

Pobrałem zestaw SDK iOS 5 i stwierdziłem, że ARC jest wspaniałą cechą nowego kompilatora Apple. Na razie wiele frameworków stron trzecich nie obsługuje ARC. Czy mogę użyć ARC dla mojego nowego kodu i zachować aktualny kod zachowywania/zwalniania bez zmian? Konwerter ARC nie działa tutaj, ponieważ niektóre frameworki, takie jak JSONKit, nie mogą zostać przekonwertowane na ARC za pomocą konwertera.Wyłącz automatyczne liczenie referencji dla niektórych plików

Edit:

Odpowiedź jest dodanie -fno-objc-arc do flag kompilatora dla plików, które nie chcą ARC. W Xcode 4 możesz to zrobić pod swoim celem -> Build Phases -> Compile Sources.

+2

Aby wyjaśnić, wystarczy dodać go do '.m' pliku. Nie plik '.h'. – ma11hew28

+10

[Dokumentacja ARC jest publicznie dostępna na stronie LLVM.] (Http://clang.llvm.org/docs/AutomaticReferenceCounting.html) –

+0

Znalazłem tę rozmowę: https://github.com/gowalla/AFNetworking/issues/ 36 Może to pomogło komuś, jak zintegrować JSONKit w ramach wspieranego projektu iOS5 ARC ;-) Ale nie próbowałem tego w tej chwili ... –

Odpowiedz

73

The public ARC docs, a nie bezpośrednio jasne w tej kwestii, wydają się sugerować, że tak długo, jak każda klasa jest albo wszystko ARC lub wszystkie zarządzane ręcznie, zajęcia mogą być zintegrowane w jeden program.

Nie można mieszać tylko ARC i nie ARC w jednej klasie; dokument mówi, że wysyłanie wiadomości w dowolny sposób (w tym zegary i opóźnione wykonania, które używają @selector) za pomocą dowolnych środków (w tym timerów i opóźnionych wykonań) jest zbanowane w kodzie ARC. Więc nie możesz wykonywać nie-ARC w klasie ARC (ponieważ konieczne komunikaty są zbanowane) i nie możesz wykonywać ARC w klasie innej niż ARC (ponieważ ARC dodaje elementy składni, które są nieprawidłowe bez ARC).

Ten sam dokument jest nieco bardziej przejrzysty w kwestii tego, czy można zintegrować biblioteki/struktury inne niż ARC w programie ARC: Tak. Nie wspomina o tym, 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ę być tak.

+0

Dziękujemy! Zorientowałem się, jak wyłączyć ARC dla istniejących klas niezwiązanych z ARC. – nonamelive

+0

Czy możesz podzielić się z nami tym, co robisz? –

+1

@David H: Jeśli chciałeś zwrócić się do tego z pytającym, powinieneś zauważyć, że pytający zmienił swoje rozwiązanie na pytanie. –

35

Jeśli chcesz wyłączyć automatyczne liczenie odnośników dla niektórych plików, to naprawdę proste jest wykonanie kroków. Dodajesz flagi kompilatora w Targetach -> Fazy budowy -> Źródła kompilacji.

xcode

Flaga używana jest -fno-objc łukowego naciśnij enter po zapisaniu go.! Musisz kliknąć dwukrotnie prawą kolumnę wiersza w obszarze Flagi kompilatora. Nadzieja pomaga Dzięki :)

+14

Możesz użyć tej samej metody, aby ** włączyć ** ARC dla określonego pliku w projekcie innym niż ARC, używając flagi '-fobjc-arc'. – lnafziger

+0

Kompilacja ARC nie może być wyłączona w plikach HEADER. Clang NIE skompiluje interfejsu/nagłówka w oparciu o kompilację jego pliku implementacji/metody. Dlatego pliki nagłówkowe muszą być kompatybilne zarówno z ARC, jak i bez ARC w mieszanej kompilacji. Uważam to za błąd w kompilatorze. – carmin

76

nie jest bardzo intuicyjny, jak wyłączyć ARC na MULTIPLE plików, przez chwilę miałem zrobić to jeden po drugim, aż zorientowali się, jak to zrobić.

  1. Wybierz żądany plików w Target/Budowanie Fazy/przełożony Źródła w Xcode (Cmd + Shift + kliknięcie lub kliknięcie)
  2. Naciśnij ENTER (dwukrotne kliknięcie spowoduje zresetowanie wybór, więc nie podlega praca)
  3. Rodzaj -fno-objc łukowego
  4. Naciśnij Enter lub Sporządzono
+1

To nie jest odpowiedź na zadane tutaj pytanie, ale i tak cholernie dobra wskazówka! Zagłosowano +1 –

+0

Masz rację, nie jest, ale zawsze szukałem tylko przełącznika, a ta odpowiedź to jedno z najlepszych trafień. Myślałem, że w dzisiejszych czasach większość ludzi zna już odpowiedź, ale nie tę "wskazówkę" – Tibidabo

0

Aby wyłączyć ARC dla poszczególnych klas trzeba będzie iść do budowy Fazy po kliknięciu projektu w Xcode i rozwinąć kompilacji źródeł sekcje.

Po prawej stronie pojawi się opcja dodawania flag kompilatora dla określonych klas. Ustawienie opcji -fno-objc-arc dla klasy spowoduje wyłączenie ARC.

źródło: Disable Automatic Reference Counting with -fno-objc-arc

Powiązane problemy