6

Mam aplikację (tylko ios5), która w metodzie deklaruje słabą zmienną używaną wewnątrz bloku do odwołania się do instancji kontroler widoku.Objective-C ARC __weak wyzwalacz zmiennych wyzwala ostrzeżenie "Atrybutu __weak nie można określić na zmiennej automatycznej"

QRCodeViewController * __weak weakSelf = self; 

Problem polega na tym, że kompilator pokazuje ostrzeżenie, mówiąc:

atrybut __weak nie może być określona na automatycznym zmiennym

w tym zgłoszeniu Używałem wiele słabych referencji i nigdy nie widziałem takiego ostrzeżenia, jedyną różnicą w stosunku do innych klas jest to, że ta klasa jest zaimplementowana w pliku .mm, ponieważ używa obiektu C++ i projekt nie może się skompilować, jeśli zostawiam go jako .m.
Muszę powiedzieć, że kod wydaje się działać dobrze.
Jakieś sugestie?

+0

nie powinna istnieć '__weak QRCodeViewController * weakSelf = siebie;'? –

+2

@Martin albo działa, są one równoważne, twoja droga to ta, którą widzę częściej używana, ale sposób Andrei jest taki, który polecił Apple. –

+0

Podobne pytanie: http://stackoverflow.com/questions/10431110/nested-blocks-and-references-toself. Odpowiedź była taka, że ​​cel wdrożenia został ustawiony na 4.0, ale nie w tym przypadku. Poprawny? –

Odpowiedz

4

obliczu tego samego ostrzeżenie, robię to zniknie za pomocą __block przypisują następujący sposób:

__block __weak MyViewController* weakSelf = self; 
+0

Dobrze działa !!!! – Andrea

0

Nie jestem pewien, dlaczego ostrzeżenie mówi, że __weak nie można określić. AFAIK powinno być możliwe do określenia, nawet jeśli używanie zmiennych automatycznych jest bardzo niebezpieczne w przypadku __weak.

Dokumentacja Apple mówi, że kompilator wyświetli ostrzeżenie, ale faktyczny tekst ostrzegawczy zdaje się sugerować, że atrybut zostanie zignorowany nie tylko dlatego, że używanie go jest niebezpieczne, podczas gdy dokumentacja sugeruje, że jest to niebezpieczne, ale działa zgodnie z oczekiwaniami (jeśli naprawdę wiesz, czego się spodziewać).

Będziesz musiał przeprowadzić pewne eksperymenty, aby sprawdzić, czy tekst ostrzeżenia jest niewłaściwy lub czy dokumentacja nie została poprawnie zaktualizowana.

+0

Cześć Plik analogowy, dziękuję za odpowiedź, faktem jest, że normalne jest tworzenie słabych odniesień dla obiektów, które chcesz przekazać do bloku, aby uniknąć cykli zatrzymania. Zrobiłem mnóstwo razy w moim kodzie bez żadnego ostrzeżenia. Zgadzam się, że słabość dla zmiennej automatycznej jest niebezpieczna, lub lepiej jest bezsensowna, ponieważ kiedy użyjesz bloku w procesie asynchronicznym, zmienna zniknie, ponieważ nie ma silnego odniesienia do niej. Ale tutaj przypisuję sobie samo, które nie jest zmienną automatyczną i jest silnie związane z istnieniem samej klasy. – Andrea

+0

To nie jest bzdura. Jak pan twierdzi, ma on całkowicie uzasadnione przypadki użycia. Ale to niebezpieczne. Twój przykład asynchroniczny jest na miejscu (wiele osób będzie miało problemy ze zrozumieniem, dlaczego to nie działa). To jest uzasadnienie wyboru Apple, aby uczynić go legalnym, a jednak wypluł ostrzeżenie.Jeśli sprawdziłeś, że to działa, domyślam się, że problem tkwi głównie w tekście ostrzegawczym, a nie w tym, że otrzymujesz ostrzeżenie (co jest świadomą decyzją twórców kompilatorów zgodnie z dokumentami). Właśnie dlatego jest to tylko ostrzeżenie, nawet jeśli jest to błędne. –

+1

@Aalogal: Czy masz odniesienia do dokumentacji Apple, gdzie mówi się, że kompilator wysyła ostrzeżenie, jeśli __weak jest używany z automatycznymi zmiennymi? Dziękuję Ci! –