Najlepsze praktyki iOS 5 (zwolnić / zachować?)

109

Jako początkujący programista iPhone'a, jaka jest najlepsza praktyka przy pisaniu aplikacji, które mają być używane z iOS 5 lub starszymi wersjami? W szczególności, czy powinienem nadal korzystać z udostępniania / zatrzymywania danych, czy powinienem to zignorować? Czy to ma znaczenie?

Geekgirl
źródło
1
Korzystaj z ARC i postępuj zgodnie z najlepszymi praktykami przedstawionymi tutaj: amattn.com/2011/12/07/arc_best_practices.html Jeśli to zrobisz, przekonasz się, że ARC „po prostu działa”. Jeśli nie zastosujesz się do tych praktyk, skończysz z wyciekami i spędzisz dużo czasu na ich śledzeniu ...
n13

Odpowiedzi:

98

To zależy od Ciebie. Możesz pisać aplikacje za pomocą ARC (Automatic Reference Counting), a Xcode zapisze „kod kleju”, aby umożliwić aplikacjom obsługującym ARC działanie w systemie iOS 4 bez konieczności modyfikacji. Jednak niektóre rzeczy nie zadziałają, a najbardziej zauważalne jest, że wiele bibliotek, których możesz chcieć użyć, (czasami) generuje niezliczone błędy i nie będziesz mógł z nich korzystać, dopóki programiści nie wydadzą aktualizacji zgodnej z ARC.


Edycja : Niedawno odkryłem, że możesz wyłączyć ARC dla każdego pliku. Zobacz pixelfreak odpowiedź „s . Tak więc moja rada jest nadal aktualna, ale teraz biblioteki innych firm nie powinny wymagać aktualizacji do pracy z ARC.

Oto, co Apple mówi o rezygnacji z ARC dla określonych plików:

Podczas migracji projektu do korzystania z ARC flaga kompilatora -fobjc-arc jest ustawiana jako domyślna dla wszystkich plików źródłowych Objective-C. Możesz wyłączyć ARC dla określonej klasy, używając flagi kompilatora -fno-objc-arc dla tej klasy. W Xcode, na docelowej karcie Fazy kompilacji, otwórz grupę Compile Sources, aby wyświetlić listę plików źródłowych. Kliknij dwukrotnie plik, dla którego chcesz ustawić flagę, wprowadź -fno-objc-arc w panelu podręcznym, a następnie kliknij Gotowe.

wprowadź opis obrazu tutaj

Zobacz pełny przewodnik dotyczący przenoszenia tutaj .

sudo rm -rf
źródło
15
ARC można najwyraźniej wyłączyć na zasadzie „dla każdego pliku”, być może zezwalając na użycie starszych bibliotek… Ale nie bawiłem się nim, więc jeszcze nie wiem. Jestem tym jednak bardzo podekscytowany. Czy możesz sobie wyobrazić świat, w którym twórcy iOS nie muszą się pocić, aby zachować / wypuścić? O czym będziemy rozmawiać w SO? ;-)
Dan Ray
45
Właśnie wtedy, gdy w końcu zrozumiałem wszystkie te bzdury związane z zarządzaniem pamięcią, a potem robią to nieistotne. OFERTY PRACY!!!
Kongress,
@Dan: Nie żartujesz, czy można to selektywnie wyłączyć? Podaj link, który jest dla mnie ważny! : D
sudo rm -rf
1
Uważam, że kompilator nie jest teraz objęty umową o zachowaniu poufności, więc aby selektywnie wykluczyć niektóre pliki (zazwyczaj foldery źródłowe stron trzecich) z kodu, po prostu dodaj to jako opcję kompilatora do każdego pliku: -fno-objc-arc
blackjack75
2
@Yar: Tak, jesteś. Chciałbym, żeby to było takie proste, ale niestety nie wszystkie biblioteki są takie proste. Weźmy JSONKitna przykład. Spróbuj przeprowadzić to przez sprawdzenie ARC. Zobaczysz, co mam na myśli. ;)
sudo rm -rf
170

Dla każdego, kto wciąż jest ciekawy, jak wyłączyć ARC w poszczególnych plikach, oto co zrobiłem:

  1. Przejdź do ustawień projektu w sekcji Build Phases > Compile Sources
  2. Wybierz pliki, które chcesz wyłączyć ARC i dodaj flagi kompilatora -fno-objc-arc . Możesz ustawić flagi dla wielu plików w jednym ujęciu, wybierając pliki, a następnie naciskając klawisz „Enter”.

Nie wiem, czy to zalecany sposób, ale u mnie działa.

PS: Zebrałem te informacje z clang.llvm.org tutaj, które są publicznie dostępne, a więc nie na mocy NDA.

pixelfreak
źródło
1
Kiedy używam tej flagi z biblioteką, działa, ale gdy tylko dołączam plik lib .h do klasy ARC, Xcode narzeka, jakbym nie miał tam flagi. Czy udało Ci się zmusić starsze biblioteki do pracy z tą flagą?
casey
Jestem w stanie uruchomić ASIHttpRequest i SBJson (otrzymuję 1 ostrzeżenie o użyciu struktury w Reachability.h). Umieszczam flagę we wszystkich ich plikach implementacyjnych.
pixelfreak
Wszystkie pliki wdrożeniowe czy tylko .h? W mojej sekcji Compile Sources projektu ma tylko pliki nagłówkowe, bez plików implementacji. Mogę dodać je, ale nie wydają się mieć inny efekt. Dla twojej wiadomości próbuję uzyskać parser REST do pracy. ( github.com/mirek/NSMutableDictionary-REST.framework )
casey
1
Aha! Nie przyjrzałem się wystarczająco dokładnie błędom. Są to inne błędy niż bez flagi. Musiałem tylko usunąć pulę automatycznych wersji z kodu i co za!
casey
Kiedy wybieram wiele plików i wciskam Enter, jak sugerowano tutaj, wszystkie zostały usunięte z „Kompiluj źródła” w fazie kompilacji. Musiałem je wybierać indywidualnie. Nie jestem pewien, czy robię coś źle.
Gopalakrishnan Subramanian
10

iOS 5 jest nadal objęty umową o zachowaniu poufności i prawdopodobnie będzie obowiązywać do czasu udostępnienia publicznej wersji. Jeśli masz konto programisty, przejdź do forów programistów Apple i zapytaj.

W przypadku poprzednich wersji musisz policzyć odniesienia i odpowiednio zachować i zwolnić. Sprawdź przewodnik zarządzania pamięcią .

Edycja: Oto publiczna specyfikacja automatycznego liczenia referencji i cytat z publicznej strony iOS 5 :

Automatyczne liczenie odwołań (ARC) dla Objective-C sprawia, że ​​zarządzanie pamięcią jest zadaniem kompilatora. Włączając ARC z nowym kompilatorem Apple LLVM, już nigdy nie będziesz musiał pisać zachowaj lub zwolnij ponownie, co znacznie upraszcza proces programowania, jednocześnie redukując awarie i wycieki pamięci. Kompilator ma pełne zrozumienie twoich obiektów i zwalnia każdy obiekt natychmiast, gdy nie jest już używany, więc aplikacje działają tak szybko, jak zawsze, z przewidywalną, płynną wydajnością.

Nevan King
źródło
Czy aplikacje stworzone przy użyciu iOS 5 będą działać ze starszymi iPhone'ami?
Geekgirl
Będziesz mógł używać narzędzi do programowania dla starszych systemów operacyjnych, ale nie będziesz mógł korzystać z nowych technologii, takich jak ARC. Jeśli chcesz kierować reklamy na starsze systemy operacyjne, musisz ręcznie zarządzać pamięcią. Jeśli chcesz korzystać z ARC, musisz ograniczyć użytkowników do iOS 5.
nevan king
1
Odniesienie do ARC znajduje się na ogólnodostępnej stronie Apple developer.apple.com/technologies/ios5, więc przynajmniej niektóre jej części nie są objęte umową o zachowaniu poufności.
cobbal
8
Właściwie to nie do końca prawda. Możesz zbudować dla iOS 4 z ARC. Cytat z inżyniera Apple: „ W przypadku systemów iOS 4 i Mac OS 10.6 kompilator dodaje do aplikacji trochę kodu kleju zapewniającego zgodność ze środowiskiem wykonawczym. Działa to w przypadku wszystkiego z wyjątkiem zmiennych __weak, które wymagają większej obsługi niż zapewnia kod zgodności. ARC w systemie iOS 4 jest prostszy niż kod inny niż ARC, ale nie jest tak prosty jak ARC na iOS 5. „Nawiasem mówiąc, aplikacja harmonogramu WWDC została napisana w ARC i działała dobrze na iOS 4!
sudo rm -rf
3
Tak; jednakże zostało to zakwalifikowane na wykładzie ARC, ponieważ tylko cele 4.3.x otrzymują „klej kompatybilności”.
Alan Zeino,
4

Szczegóły są obecnie niewielkie / objęte umową NDA, ale firma Apple wdrożyła automatyczne zliczanie referencji (ARC) w iOS 5, jak opisano tutaj: http://developer.apple.com/technologies/ios5/

Jeśli tworzysz nową aplikację w Xcode 4 z zestawem SDK systemu iOS 5, możesz bezpiecznie zignorować liczenie zachowań / wydań.

[edytuj] sudo rm -rf ma rację; może mieć to znaczący wpływ na biblioteki stron trzecich

Dominic
źródło
Czy aplikacje stworzone przy użyciu iOS 5 będą działać ze starszymi iPhone'ami?
Geekgirl
Będzie działać na iPhone'ach z systemem iOS 5, więc tylko iPhone 3GS lub iPhone 4. Nie wierzę, że będzie obsługiwał iOS 4, ale z drugiej strony jest to robione przez LLVM podczas kompilacji, więc może być możliwe utworzenie pliku binarnego dla iOS 4 i 5. Bardzo polecam założenie konta programisty iOS i zabawę z dostępnymi opcjami.
Dominic
Jak zauważa sudo w swoim komentarzu do odpowiedzi Nevana, możesz rzeczywiście kierować z powrotem do iOS 4.0 z ARC, więc starsze urządzenia, które mogą obsługiwać ten system operacyjny, są z tym zgodne.
Brad Larson
3

Nikt nie wspomniał o SystemConfiguration.framework ? Nie zapomnij umieścić go w Framework . Żałośnie spędziłem kilka godzin, aby to zrozumieć.

ThinkChris
źródło
powinieneś wyjaśnić dlaczego.
John Riselvato
3

Z pewnością jest to wybór dewelopera lub zespołu. ARC (Automatic Reference Counter) nieco ułatwiło sprawę, automatycznie zarządzając pamięcią za Ciebie. W razie potrzeby zwolni, zachowa i cofnie przydział. Uważam, że doświadczenie w zarządzaniu pamięcią powinieneś zdobyć samodzielnie, najlepiej w aplikacji testowej, jeśli jeszcze tego nie zrobiłeś. Inną rzeczą do rozważenia jest to, czy Twoja aplikacja opiera się na bibliotekach innych firm, które, jeśli nie zostaną przekonwertowane na ARC, uniemożliwi kompilację aplikacji. Wybór zależy oczywiście od aktualnej sytuacji.

Charles
źródło
0

ustaw flagę jako -fno-objc-arc w ustawieniach projektu> Fazy kompilacji> Kompiluj źródła

Mubin Shaikh
źródło