2012-03-07 5 views
15

Właśnie dokonałem konwersji mojej aplikacji na ARC, a podczas gdy wszystko będzie dobrze, otrzymam 600 ostrzeżeń dotyczących moich właściwości. Takich jak:Aplikacja została przekonwertowana na ARC, teraz otrzymuję ostrzeżenia o moich usługach

domyślny atrybut właściwość 'przypisać' nie jest właściwe dla non-gc obiektu

Nie 'przypisać', 'zachować' albo atrybut 'kopia' jest określony - 'assign' jest Zakłada

Screenshot for warning

Po Xcode konwertowane mojego kodu, tutaj jest to, co moi właściwości wyglądać następująco:

@property (nonatomic) EKEventStore *eventStore; 
@property (nonatomic) EKCalendar *defaultCalendar; 
@property (nonatomic) UIActionSheet *currentActionSheet; 
@property (nonatomic) UILabel *noEventLabel; 

Ktoś mówił o konieczności dodania strong do wszystkich tych. Czy tak jest? Czy Xcode zapomniał dodać coś?

+0

Jakie właściwości wyglądały przed konwersją? Nie używam jeszcze ARC, ale spodziewam się zobaczyć (nieatomowy, zachowujący) lub (nieatomowy, przypisać) itp. –

+0

Tak, zanim były (nieatomowe, zachowują) –

Odpowiedz

18

ARC ma rację. Nie można mieć kwalifikatora zarządzania pamięcią; ty musi powiedzieć przypisać, zachować (lub silny, który jest to samo), lub słabe.

Poprzednio przypisano wartość domyślną. Ale to prawdopodobnie nie jest to, czego chcesz, ponieważ jest to najgorsza możliwa opcja - jest to słaby punkt odniesienia w starym stylu, niezwiązany z ARC. Musisz albo mieć słaby referencyjny ARC (idzie do zera, gdy obiekt zanika), albo silne odniesienie (zarządzany pamięcią przez ARC).

+0

Ok, ponieważ były kiedyś (nieatomowe, zachowujące) Zakładam, że chciałbym teraz (nieatomowy, silny), czy to prawda? Dlaczego Xcode nie zrobiłby tego dla mnie ?! –

+0

To, czy nieruchomość jest silna, czy słaba, zależy od programisty.Jednym z celów Apple'a dla ARC było to, aby był w 100% niezawodny, więc nie zamierzają zakładać w taki czy inny sposób (założenie przypisania było przed ARC, więc jest inaczej). –

+0

@NicHubbard: To brzmi jak potencjalny błąd. Jeśli wcześniej "zatrzymałeś", to prawdopodobnie chcesz "silny". Możesz [zgłosić raport o błędzie] (http://bugreport.apple.com). –

7

Przepraszam, że dodałem drugą odpowiedź, ale okazało się to być bardziej skomplikowane, niż myślałem. Okazuje się, że widzisz zmienione zachowanie (być może błąd?) W Xcode 4.3.

W Xcode 4.2 konwerter zaproponowałby zmianę (nonatomic, retain) na (nonatomic, strong). Ale w Xcode 4.3 oferuje on zmianę na (nonatomic); Domyślam się, że jeśli tego nie chcesz, zmienianie retain na strong należy do ciebie przed konwersją.

Z drugiej strony, w Xcode 4.2, (nonatomic) sam był całkowicie nielegalny dla zsyntetyzowanej właściwości; w Xcode 4.3, to nie jest: otrzymujesz ostrzeżenie, ale zakładasz, że masz na myśli assign i dlatego nie jest to nielegalne.

Tak więc nastąpiła zmiana w działaniu ARC w LLVM 3.1 i towarzysząca mu zmiana w konwerterze Xcode 4.3 ARC.

+0

Dzięki za wyczyszczenie tego. –

+2

To nie ma sensu. Ustawieniem domyślnym jest teraz SILNY, nieprzypisany. Sam (nieatomowy) powinien oznaczać (nieatomowy, silny). Ostrzeżenie jest tym, które jest złe. –

+0

A to, panie i panowie, jest to, dlaczego projekt, który wciąż mogę ** NIE ** pomyślnie przekonwertować na ARC na mojej głównej maszynie Xcode 4.2, którą przeniosłem przez LAN do innego komputera Mac z systemem Lion/Xcode 4.3, aby przeprowadzić migrację, a następnie z powrotem, nie zbuduje. Sądzę, że wszyscy możemy się zgodzić, że ARC wciąż jest w wersji ** beta **? –

3

Myślę, że odpowiedzi są błędne.

W Xcode 4.3 otrzymujesz ostrzeżenie. Zakłada jednak, że masz na myśli RETAIN. Zachowaj to nowa wartość domyślna dla kodów pod ARC. Ktoś mi powiedział, że naprawia to xcode.

Proszę mnie poprawić, jeśli się mylę.

+1

To się zgadza. Dokładniej, właściwości obiektów obj-c są domyślnie silne. –