/ / Cel C: Wyciek pamięci w nieoidalnej metodzie instancji - cel-c, ios, wycieki pamięci

Cel C: Wyciek pamięci w nieoidalnej metodzie instancji - cel-c, ios, wycieki pamięci

Dostaję kolejny wyciek pamięci w niezabezpieczonej metodzie instancji, która zwraca obiekt klasy NSMutableArray.

wprowadź opis obrazu tutaj

Czy ktoś może mi doradzić, w jaki sposób mogę naprawić ten wyciek? Próbowałem wydać "userFollowings" na końcu metody, ale nadal zgłasza wyciek.

Odpowiedzi:

9 dla odpowiedzi № 1

Kiedy masz zwrócić obiekt z metodyw którym został zainicjowany lub zachowany, powszechną praktyką jest zwrócenie go autoreleased. W ten sposób użytkownik otrzymujący obiekt nie musi się martwić o jego zwolnienie. Ostateczna linia kodu powinna wyglądać następująco:

return [userFollowing autorelease];

Prawdopodobnie nie zaszkodzi trochę czytać Podręcznik programowania zarządzania pamięcią aby nadrobić zaległości w zarządzaniu pamięcią, takie jak to, i jest mnóstwo innych pomocnych zasobów dostępnych w Internecie i na tej stronie.


3 dla odpowiedzi № 2

Tam są zestaw konwencji używane przez programy Cocoa, które powodują, że zarządzanie pamięcią jest mniej podatne na błędy. Gdy metoda zwraca obiekt, kod, który go wywołuje, musi wiedzieć, czy jest jego właścicielem, czy też nie.

Sprowadza się to do tego, że jeśli piszesz metodę, która zwraca obiekt i ta metoda nie przenosi własności na osobę wywołującą, nazywając ją czymś podobnym new, alloc, copy, itp., musisz autorelease zanim zwrócisz.

Właśnie o tym mówi wiadomość - "Obiekt zwrócony dzwoniącemu jako referencja posiadania" oznacza, że ​​przenosisz własność na kod wywołujący. Problem polega na tym, że nazwa metody wskazuje inaczej.

Gdybym zadzwonił na twoją metodę i musiałbym trzymać się przedmiotu, zadzwoniłbym retain na nim tak, że ją posiadałem. Muszę to zrobić, ponieważ twoja nazwa metody sugerowała, że ​​nie byłam właścicielem. Tak długo, jak zwracasz autoreleased obiekt, to jest poprawne. Ale jeśli nie wyrejestrujesz obiektu automatycznie, otrzymasz liczbę zatrzymań równą 2 - raz, gdy ją przydzieliłeś, i raz, gdy ją zachowałem, a kiedy w końcu uda mi się ją uwolnić, wciąż będzie mieć 1, i nigdy nie zostanie zwolniony z pamięci, co spowoduje wyciek pamięci.


2 dla odpowiedzi nr 3

Problemem jest userFollowings nigdy nie zostanie wydany. Spróbuj zakończyć

return [userFollowings autorelease];

1 dla odpowiedzi nr 4

Spróbuj tego:

   NSMutableArray* userfollwings = [[[NSMutableArray alloc] init] autorelease]