2012-01-05 24 views
7

Opracowałem aplikację na iPhone'a, która powinna obsługiwać iPhone/iPad na iOS4 i iOS5.ARC lub nie na ARC iphone iOS5

Moja aplikacja przecieka pamięć w kilku miejscach, co staje się trudne do debugowania ze względu na rozmiar kodu. Niedawno przeczytałem o ARC (Automatic Reference Counting), moje zapytanie jest

  1. muszę zmodyfikować mojego kodu źródłowego (zachowują/release/alloc/dealloc) do kompilacji z ARC. także jakie wszystkie zmiany musimy wprowadzić, używając ARC?

  2. Czy wskazane jest przejście na ARC?

  3. moja aplikacja praca na iOS4 telefonu w przypadku korzystania z ARC

dzięki.

+0

Proponuję, aby to pytanie było wpisane do wiki ... zdecydowanie jest to dobre pytanie i definitywnie związane z programowaniem, ale większość Pytanie brzmi naprawdę i odnosi się do konkretnych okoliczności. –

+1

Zadajesz tutaj trzy różne pytania. Drugi jest objęty [iOS 5 Best Practice (Release/retain?)] (Http://stackoverflow.com/questions/6308425/ios-5-best-practice-release-retain), a trzeci przez [if convert projektu do automatycznego liczenia odwołań (ARC), czy nadal obsługuje on iOS 3.X, 4.X?] (http://stackoverflow.com/questions/6421753/if-convert-project-to-automatic-reference-countingarc -is-it-still-support-on) –

Odpowiedz

14

Prawdopodobnie nie jest to najlepsze miejsce na opublikowanie tego pytania, ale odpowiem, ponieważ nie mam nic przeciwko temu.

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

  1. można użyć narzędzia do migracji 'Edycja> Refactor> Konwersja do Objective-C ARC' i ręcznie naprawić wszystko narzędzie nie może dowiedzieć.

  2. Tak.

  3. Tak, ale zerowe słabe referencje nie będą.

+0

Jeszcze jedna uwaga jest taka, że ​​wiele bibliotek stron trzecich nie ma jeszcze dobrych wersji łuku. To powstrzymuje mnie przed uaktualnieniem niektórych z moich istniejących projektów. –

+2

Możesz selektywnie wykluczyć dowolny plik źródłowy z ARC po uruchomieniu konwersji. Po prostu usuń zaznaczenie plików klas stron trzecich na etapie sprawdzania inspekcji narzędzia ARC, a następnie pominie je i oznaczy je opcją -fno-objc-arc, aby wykluczyć je z sprawdzania ARC. Jest to jedna z najlepszych cech ARC - możesz łączyć ze sobą pliki ARC i pliki spoza ARC w tym samym projekcie. –

4

Zdecydowanie uważam, że to jest dobre dla programistów, aby zrozumieć, jak zarządzanie pamięcią i system faktycznie działa ... ale myślę, że ARC jest bardzo dobry system i działa bardzo dobrze. To jest naprawdę pytanie poglądowe, więc moim zdaniem prawie zawsze warto rozpoczynać nowe projekty, które będą kierować reklamy na aplikacje systemu operacyjnego iOS 5 w ARC, z wyjątkiem bardzo szczególnych okoliczności.

Uważam, że jeśli używasz wielu bibliotek C w swoim kodzie, ARC jest nieco trudniejsze w użyciu (więc jeśli w większości korzystasz z bibliotek C innych firm i takich rzeczy jak CoreFoundation, może rozważyć, czy ma to sens, czy nie), ale nawet wtedy, jeśli te biblioteki są w większości odizolowane od kontrolerów Objective-C i takie, ARC jest nadal dobre.

W przypadku starszych aplikacji należy sprawdzić wykorzystanie aplikacji i jej wzorce. Jeśli używasz wielu metod delegowania, ponieważ nie możesz używać słabych referencji na iOS 4, staje się to nieco trudniejsze i prawdopodobnie będziesz musiał mieć mieszany kod ARC i kod spoza ARC. Być może lepiej jest podjąć decyzję projektową, aby przejść do przodu z ARC. Tak więc nowe funkcje są przeznaczone dla iOS 5 i być może nie są dostępne (lub w pełni dostępne) w wersji iOS 4 aplikacji, a te używają ARC.

Rzeczywiście, w ostatecznym rozrachunku będzie to zależeć od tego, jak aplikacja została już zaprojektowana, jak duża jest i jak wygodne jest zarządzanie zarządzanym pamięcią i użycie/ograniczenia ARC. Na przykład mam trzy projekty, których nigdy nie przekonwertowałbym na ARC, jeden, który teraz robię mieszane, taki, który jest w pełni przekonwertowany (ale nadal jest kierowany na iOS 4+) i 2, które są w pełni ARC i iOS 5+ tylko.

+0

OpenGL jest technicznie API C, aczkolwiek bez żadnego bezpośredniego przechowywania obiektów, dlatego nie ma potrzeby "mostów"; Wszystkie obiekty są wewnętrzne i nieprzejrzyste i dostępne za pośrednictwem funkcji i identyfikatorów całkowitych. Czy jest jednak coś, o czym należy pamiętać podczas korzystania z OpenGL w kodzie ARC Obj-C? –

1

Żeby było jasne, natomiast nie można używać ARC słabe referencje jeśli są kierowane iOS 4, ty może nadal korzystać unsafe_unretained, który jest w zasadzie równoznaczne z użyciem assign do właściwości obiektu. Oznacza to, że możesz przekonwertować dobrze napisany kod spoza ARC na ARC bez przypadkowego utworzenia cykli zatrzymania na iOS 4.

Użycie unsafe_unretained powoduje utratę funkcji auto-zerowej słabych referencji, ale nadal otrzymujesz wszystkie inne zalety ARC, takie jak nie martwienie się o zapominanie o wypuszczeniu ivarów w twoich oświadczeniach dealloc, itp.