Kilka pytań na temat automatycznego zliczania referencji w iOS5 SDK

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

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

  2. Jeśli opracuję nową aplikację na iOS 5 za pomocą ARC, czy będę musiał wdrożyć jakiś rodzaj kontroli "retro-kompatybilności"? czyli: czy będę musiał sprawdzić wersję iOS i odpowiednio wywołać zachowaj i zwolnij? Czy ARC jest dostępny dla wszystkich wersji iOS lub tylko dla iOS 5?

Author: Nakilon, 2011-06-16

5 answers

Jeśli zdecyduję się na aktualizację do iOS 5, czy trzeba usunąć wszystkie [myobject retain] oraz [myObject release] oświadczenia z mój kod?

Tak, ale XCode 4.2 zawiera nowe narzędzie" Migrate to Objective-C ARC " (w menu Edycja->Refactor), które robi to za Ciebie. Wezwanie dealloca to inna historia. Jak wspomniano w komentarzach, clang reference stwierdza, że należy zachować metodę dealloc:

uzasadnienie: mimo że ARC niszczy instancję zmienne automatycznie, nadal istnieją uzasadnione powody, aby napisać metodę dealloc, takie jak uwolnienie zasobów nieosiągalnych. Brak wywołania [super dealloc] w takiej metodzie jest prawie zawsze błędem.

Włączasz ARC używając nowego-fobjc-arc flaga kompilatora. ARC jest obsługiwany w Xcode 4.2 Dla Mac OS X v10. 6 i v10. 7 (Aplikacje 64-bitowe) oraz dla iOS 4 i iOS 5. (Słabe odniesienia nie są obsługiwane w systemie Mac OS X v10. 6 i iOS 4). Nie ma wsparcia ARC w Xcode 4.1.

-

Jeśli opracuję nową aplikację na iOS 5 za pomocą ARC, czy będę musiał wdrożyć jakieś coś w rodzaju" retro-kompatybilności"? Czyli: czy muszę sprawdzić wersję iOS i call odpowiednio? Więc, w zasadzie, jest ARC dostępne dla wszystkich wersji iOS lub po prostu dla iOS 5?

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

Zamiast pamiętać, kiedy do użycia zatrzymać, zwolnić i autorelease, ARC ocenia wymagania dotyczące żywotności Twoich obiektów i automatycznie wstawia odpowiednia metoda wzywa do Ciebie na czas kompilacji. Kompilator również generuje odpowiednie metody dealloc dla Ciebie.

Dalsze informacje o ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

 150
Author: Henrik P. Hessel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-05 13:01:46

P1: nie, jeśli masz istniejący kod, możesz go używać tak, jak to 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 fazie docelowej / kompilacji / kompilacji źródeł w Xcode
  2. NACIŚNIJ ENTER . (podwójne kliknięcie zaznacza tylko jeden plik)
  3. Type - fno-objc-arc
  4. naciśnij Enter lub zrobione

Q2: nie, target może być tak niski jak iOS 4.0

 8
Author: Tibidabo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-02 07:50:19

O ile Rozumiem i o ile mój iPhone/iPod z systemem iOS 5 i ios 4.3 działają, to wszystko jest całkiem automatyczne. Aplikacja zacząłem dla 4.0 i "zaktualizowane" do pracy z Xcode dla iOS 5.0 nigdy nie rzuca żadnego rodzaju ostrzeżenie mój sposób o zwolnieniu i utrzymanie, nawet jeśli to jest na każdym dealloc, itp. Jednak część tego samego kodu, który wstawiłem (skopiowałem plik) do nowego projektu stworzonego{[2] } z Xcode dla iOS 5 ma wiele, wiele ostrzeżeń. Więc wygląda na to, że nie musisz usuń wszystkie te połączenia i nie, w jakiś sposób dostosowuje je automatycznie do starszych wersji. Profilując mojego iPoda, nie widzę wycieków pamięci ani innych oznak awarii deallocs/releasing. Czy to pomaga?

 7
Author: Dylan Gattey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-16 07:47:46

Odnośnie tej części twojego pytania

Jeśli opracuję nową aplikację na iOS 5 za pomocą ARC, czy będę musiał wdrożyć jakieś kontrole zgodności wstecznej? Czyli: czy muszę sprawdzić wersja iOS i wywołanie zachowują i zwalniają odpowiednio? Więc, zasadniczo, czy ARC jest dostępny dla wszystkich wersji iOS lub tylko dla iOS 5?

Należy zauważyć, że kompilator iOS 5 przyjmuje "Retro-kompatybilność" (w rzeczywistości dodaje kod, aby zachować / zwolnić pracę, zasadniczo), ale jeśli nie kompilujesz dla iOS 5.0, nie możesz użyć weak jako słowa kluczowego. Zamiast tego używasz assign. To niefortunne: weak to ogromna zaleta (żadnych zwisających wskaźników, nigdy!). Zobacz moje pytanie tutaj do dyskusji na temat weak, assign i Łuk.

 5
Author: Dan Rosenstark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:07:25

Jeśli możesz wyłączyć ARC nie używając flagi kompilatora new-fobjc-arc, to nie jesteś zmuszony do ponownego pisania kodu idącego do przodu - chyba (?)

 2
Author: oliver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 09:47:19