Kilka pytań dotyczących automatycznego liczenia referencji w pakiecie SDK systemu iOS5


134

Obecnie pracuję nad aplikacją na iPada. Rozwój rozpoczął się dla iOS 4.2 i teraz jest kontynuowany (i myślę, że zostanie zakończony) dla iOS 4.3. Właśnie przeczytałem o ARC w iOS 5 iw zasadzie zrozumiałem, że już nigdy nie będziemy musieli zwalniać i zachowywać obiektów. Moje pytania to:

  1. Jeśli zdecyduję się na aktualizację do iOS 5, czy muszę usunąć wszystkie instrukcje [myObject retain]i [myObject release]z mojego kodu?

  2. Jeśli stworzę nową aplikację na iOS 5 przy użyciu ARC, czy będę musiał zaimplementować jakieś testy „zgodności wstecznej”? tj .: czy będę musiał sprawdzić wersję iOS i odpowiednio ją zachować i zwolnić? Czy w zasadzie ARC jest dostępne dla wszystkich wersji iOS, czy tylko dla iOS 5?

Odpowiedzi:


150

Jeśli zdecyduję się na aktualizację do iOS 5, czy muszę usunąć wszystkie instrukcje [myObject retain] i [myObject release] z mojego kodu?

Tak, ale XCode 4.2 zawiera nowe narzędzie „Migrate to Objective-C ARC” (w menu Edit-> Refactor), które robi to za Ciebie. Dzwonienie do dealloc to inna historia. Jak wspomniano w komentarzach, odniesienie clang mówi, że powinieneś zachować metodę dealloc:

Uzasadnienie: mimo że ARC niszczy zmienne instancji automatycznie, nadal istnieją uzasadnione powody, aby napisać metodę dealloc, takie jak zwolnienie zasobów, których nie można zachować. Brak wywołania [super dealloc] w takiej metodzie jest prawie zawsze błędem.

ARC włącza się za pomocą nowej flagi kompilatora -fobjc-arc. ARC jest obsługiwany w Xcode 4.2 dla Mac OS X 10.6 i 10.7 (aplikacje 64-bitowe) oraz dla iOS 4 i iOS 5. (Słabe referencje nie są obsługiwane w Mac OS X 10.6 i iOS 4). W Xcode 4.1 nie ma obsługi ARC.

-

Jeśli stworzę nową aplikację na iOS 5 przy użyciu ARC, czy będę musiał zaimplementować jakieś testy „zgodności wstecznej”? To znaczy: czy będę musiał sprawdzić wersję iOS i odpowiednio ją zachować i zwolnić? Czy w zasadzie ARC jest dostępne dla wszystkich wersji iOS, czy tylko dla iOS 5?

Nie, ponieważ ARC robi swoją magię w czasie kompilacji, a nie w czasie wykonywania.

Zamiast musisz pamiętać, kiedy używać funkcji retain, release i autorelease, ARC ocenia wymagania dotyczące okresu użytkowania obiektów i automatycznie wstawia odpowiednie wywołania metod w czasie kompilacji. Kompilator generuje również odpowiednie metody dealloc.

Więcej informacji na temat ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html


Dziękuję za wyjaśnienie!
Luke47

4
To nie jest w 100% poprawne. Istnieje przełącznik kompilatora, który określa, czy ARC jest włączony, czy nie. Uważam, że ARC również potrzebuje wsparcia w czasie wykonywania, więc jeśli chcesz, aby Twoja aplikacja działała na iOS 4.x, musisz pozostawić w swoich zachowaniach i wydaniach i upewnić się, że ARC jest wyłączony.
JeremyP

8
@JeremyP - iOS 4.0 jest rzeczywiście obsługiwany jako cel dla aplikacji ARC, więc nie ma potrzeby utrzymywania ręcznego zliczanego kodu referencyjnego, aby zająć się tą starszą platformą. Być może iPhone OS 3.x, ale wyobrażam sobie, że Apple może zaprzestać obsługi tego systemu jako platformy docelowej, gdy pojawi się wersja 5.0, tak jak zrobili to w przypadku wersji 2.x, gdy pojawi się 4.0.
Brad Larson

5
@Brad Baza instalacji dla iOS4 to już ponad 95%. Myślę, że i tak można bezpiecznie porzucić obsługę iOS3.
Henrik P. Hessel

2
Nie usuwasz dealloc, po prostu usuwasz wszystkie swoje releasei [super dealloc]z tego. A w 99,9% deallocpo prostu zwalnia obiekty, więc je usuwasz. Jednak obiekty nadal muszą wykonywać inne zadania porządkowe, które nie są release(zamykanie plików, usuwanie obserwatorów itp.).
Stanislav Yaglo

8

P1: NIE, Jeśli masz istniejący kod, możesz go używać tak, jak jest z -fno-objc-arc , możesz selektywnie wyłączyć ARC na dowolnym pliku.

Jeśli chcesz wyłączyć ARC na WIELU plikach:

  1. Wybierz żądane pliki w Target / Build Phases / Compile Sources w Xcode
  2. NACIŚNIJ ENTER . (podwójne kliknięcie zaznacza tylko jeden plik)
  3. Wpisz -fno-objc-arc
  4. Naciśnij Enter lub Gotowe

P2: NIE, cel może być tak niski, jak iOS 4.0


7

O ile rozumiem i o ile mój iPhone / iPod z systemem iOS 5 i iOS 4.3 działa odpowiednio, wszystko jest całkiem automatyczne. Aplikacja, którą uruchomiłem w wersji 4.0 i została „zaktualizowana” do pracy z Xcode na iOS 5.0, nigdy nie wyświetla żadnego ostrzeżenia o zwolnieniu i zachowaniu, mimo że jest to po każdym cofnięciu alokacji itp. Jednak część tego samego kodu, który wstawiłem (skopiowany plik) do nowego projektu utworzonego za pomocą Xcode na iOS 5 ma wiele, wiele ostrzeżeń. Wygląda więc na to, że nie musisz usuwać wszystkich tych wywołań i nie, w jakiś sposób dostosowuje je automatycznie do starszych wersji. Podczas profilowania mojego iPoda nie widzę wycieków pamięci ani innych oznak niepowodzenia odblokowywania / zwalniania. czy to pomaga?


Najnowsza wersja beta faktycznie prosi mnie o usunięcie wszystkich wywołań alokacji i to wszystko. Nadal możesz zachować / zwolnić, ale system ma ostatnie słowo.
Dylan Gattey

5

Odnośnie tej części twojego pytania

Jeśli stworzę nową aplikację na iOS 5 przy użyciu ARC, czy będę musiał zaimplementować jakieś testy „zgodności wstecznej”? To znaczy: czy będę musiał sprawdzić wersję iOS i odpowiednio ją zachować i zwolnić? Czy w zasadzie ARC jest dostępne dla wszystkich wersji iOS, czy tylko dla iOS 5?

Należy zauważyć, że kompilator iOS 5 przyjmuje „kompatybilność wsteczną” (w rzeczywistości dodaje kod, aby zachować / zwolnić zasadniczo działanie), ale jeśli nie kompilujesz dla iOS 5.0, nie możesz używać weakjako słowa kluczowego . Zamiast tego używasz assign. To niefortunne: weakto ogromna zaleta (bez żadnych wiszących wskazówek!). Zobacz moje pytanie tutaj do dyskusji weak, assigni ARC.


2

Jeśli możesz wyłączyć ARC, nie używając nowej flagi kompilatora -fobjc-arc, to nie jesteś zmuszony do ponownego pisania kodu posuwając się naprzód - chyba (?)

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.