Nie ma wady. Użyj tego. Zrób to dzisiaj. Jest szybszy niż twój stary kod. Jest bezpieczniejszy niż twój stary kod. To jest łatwiejsze niż twój stary kod. To nie jest odśmiecanie. Nie ma narzutu czasu wykonania GC. Kompilator wstawia i zwalnia we wszystkich miejscach, które i tak powinieneś mieć. Ale jest mądrzejszy od ciebie i może zoptymalizować te, które nie są w rzeczywistości potrzebne (tak jak może rozwinąć pętle, wyeliminować zmienne tymczasowe, funkcje wbudowane itp.)
OK, teraz opowiem o małych wadach:
Jeśli jesteś wieloletnim programistą ObjC, będziesz drgać przez około tydzień, gdy zobaczysz kod ARC. Bardzo szybko przezwyciężysz to.
Istnieją pewne (bardzo) małe komplikacje w łączeniu się z kodem Core Foundation. Jest nieco więcej komplikacji w radzeniu sobie z wszystkim, co traktuje id
jako void*
. Rzeczy takie jak tablice C id
mogą wymagać trochę więcej myślenia, aby wykonać je poprawnie. Fantazyjna obsługa ObjC va_args
może również powodować problemy. Większość rzeczy związanych z matematyką na wskaźniku ObjC jest trudniejsza. W każdym razie nie powinieneś mieć tego dużo.
Nie można umieścić id
w sposób struct
. Jest to dość rzadkie, ale czasami służy do pakowania danych.
Jeśli nie zastosowałeś prawidłowego nazewnictwa KVC i zmieszasz kod ARC i inny niż ARC, będziesz mieć problemy z pamięcią. ARC używa nazewnictwa KVC do podejmowania decyzji dotyczących zarządzania pamięcią. Jeśli to cały kod ARC, to nie ma to znaczenia, ponieważ zrobi to tak samo „źle” po obu stronach. Ale jeśli jest to mieszane ARC / inne niż ARC, oznacza to niezgodność.
ARC spowoduje wyciek pamięci podczas zgłaszania wyjątków ObjC. Wyjątek ObjC powinien być bardzo bliski zakończenia programu. Jeśli łapiesz znaczną liczbę wyjątków ObjC, używasz ich niepoprawnie. Można to naprawić za pomocą -fobjc-arc-exceptions
, ale wiąże się to z karami omówionymi poniżej:
ARC nie spowoduje wycieku pamięci podczas zgłaszania wyjątków ObjC lub C ++ w kodzie ObjC ++, ale odbywa się to kosztem wydajności czasu i przestrzeni. To kolejny z długiej listy powodów, dla których warto zminimalizować użycie ObjC ++.
ARC w ogóle nie będzie działać na iPhoneOS 3 lub Mac OS X 10.5 lub starszym. (To wyklucza mnie z używania ARC w wielu projektach).
__weak
wskaźniki nie działają poprawnie na iOS 4 lub Mac OS X 10.6, co jest wstydem, ale dość łatwe do obejścia. __weak
wskazówki są świetne, ale nie są najważniejszym punktem sprzedaży ARC.
Dla ponad 95% kodu, ARC jest genialny i nie ma żadnego powodu, aby go unikać (pod warunkiem, że poradzisz sobie z ograniczeniami wersji systemu operacyjnego). W przypadku kodu innego niż ARC można przekazywać -fno-objc-arc
plik po pliku. Niestety Xcode sprawia, że jest to znacznie trudniejsze niż powinno to być w praktyce. Prawdopodobnie powinieneś przenieść kod inny niż ARC do oddzielnego xcodeproj, aby to uprościć.
Podsumowując, przełącz się na ARC tak szybko, jak to możliwe i nigdy nie oglądaj się za siebie.
EDYTOWAĆ
Widziałem kilka komentarzy w stylu „używanie ARC nie zastąpi znajomości zasad zarządzania pamięcią Cocoa”. Jest to w większości prawda, ale ważne jest, aby zrozumieć, dlaczego i dlaczego nie. Po pierwsze, jeśli cały twój kod używa ARC i naruszysz Trzy Magiczne Słowaw każdym miejscu nadal nie będziesz mieć problemów. Szokujące, ale proszę bardzo. ARC może zachować pewne rzeczy, których nie chciałeś zachować, ale uwolni je również, więc to nigdy nie będzie miało znaczenia. Gdybym dzisiaj prowadził nową klasę w kakao, prawdopodobnie spędziłbym nie więcej niż pięć minut na rzeczywistych zasadach zarządzania pamięcią i prawdopodobnie wspomniałbym tylko o regułach nazewnictwa zarządzania pamięcią, omawiając nazewnictwo KVC. Wierzę, że dzięki ARC mógłbyś zostać przyzwoitym początkującym programistą bez znajomości zasad zarządzania pamięcią.
Ale nie można było zostać przyzwoitym średniozaawansowanym programistą. Musisz znać zasady, aby poprawnie łączyć się z Core Foundation, a każdy średniozaawansowany programista musi w pewnym momencie poradzić sobie z CF. I musisz znać zasady dla mieszanego kodu ARC / MRC. I musisz znać zasady, kiedy zaczynasz bawić się void*
wskazówkami id
(które nadal musisz poprawnie wykonać KVO). A bloki ... cóż, zarządzanie pamięcią blokową jest po prostu dziwne.
Chodzi mi więc o to, że podstawowe zarządzanie pamięcią jest nadal ważne, ale tam, gdzie spędzałem dużo czasu na określaniu i powtarzaniu reguł dla nowych programistów, dzięki ARC staje się to bardziej zaawansowanym tematem. Wolałbym, aby nowi programiści myśleli w kategoriach grafów obiektowych, zamiast wypełniać ich głowy wywołaniami do objc_retain()
.