"Potencjalny wyciek obiektu przydzielonego w linii n i zapisany w zmiennej" zmienna "."W jaki sposób można wyłączyć ostrzeżenie o statycznym analizatorze Xcode Clang?
Zwykle jest to bardzo pomocne ostrzeżenie analizator, ale istnieje kilka sytuacji, w których mogę zrobić irytujące fałszywych alarmów, które chciałbym, aby stłumić, aby moje wyniki analizatora czyste. W obronie analizatora, to, co dostrzega, z pewnością byłoby wyciekiem pamięci, gdyby nie uwolnienie na innej ścieżce wykonania (do której jest ślepa).
Zajmę się moją sytuacją. Zdarza się to w różnych smakach, ale ogólny wzór jest następujący:
- Obiekt zostaje przydzielony, a jego uczestnik jest ustawiony.
- Coś jest zrobione z obiektem. (Zadanie rozpoczęte, wyświetlany widok, itp.).
- Zakończono wykonywanie bieżącej metody. (Wprowadź ostrzeżenie o Clang).
- Obiekt decyduje, że jego zadanie zostało zakończone, wysyła delegata wiadomość.
- Delegat zwalnia obiekt.
To wcale nie jest ezoteryczny wzór, więc mam nadzieję, że tłumienie jest możliwe. Wiem, że można tego uniknąć, przechowując obrażliwy obiekt w ivar, który jest później zwolniony, ale bardzo wolę nie dodawać zanieczyszczenia ivar.
Uderza mnie tak dziwnie, że delegat obiektu go zatrzymuje. Zazwyczaj obiekt zachowuje delegata, a delegat zatrzyma obiekt w cyklu zatrzymania. Nie mówię, że są przypadki ZERO, w których delegat może chcieć zatrzymać (być może krótkotrwały) obiekt, ale wydaje się istotne, aby wiedzieć, dlaczego tak jest w tym przypadku. Z tego, co tu powiedziano, powiedziałbym, że jest bardziej koszerny, aby obiekt zachował się przez cały czas trwania operacji i późniejszego przekazania wiadomości, niż delegatowi, aby "przejąć na własność" domniemane zachowanie przydziału/init. – ipmcc
@ipmcc: Chociaż obiekt może zachować swojego delegata, a jest kilka miejsc w SDK, gdzie klasa to robi, powiedziałbym, że częstszym jest przechowywanie delegata jako słabego odniesienia, aby uniknąć zachowaj cykl, o którym wspomniałeś. Tak czy inaczej, zdecydowanie nie jest "typowy" dla obiektu, aby zachować swojego delegata. W moim przypadku, pewna klasa utworzyła obiekt z alloc/init i ustawiła się jako delegat. Jako właściciel klasy delegat później zwalnia obiekt po jego zakończeniu. Nie ma tu wymyślonego prawa własności. –
@ipmcc - Matt ma rację, normalny wzór to: Obiekt A tworzy Obiekt B i ustawia się jako delegat Obiektu B. Obiekt A zachowuje Obiekt B. Kiedy Obiekt A zostanie zwolniony, upewnia się, że oddzielił się jako delegat Obiektu B, w przeciwnym razie możesz ulec awarii. – DougW