2009-09-23 8 views
17

jestem coraz nieco zirytowany o niektórych obiektów jest autoreleased bez mojej wiedzy. Pewnie to dobrze, ale jeśli tak, chcę to wiedzieć. Dokumentacja nie określa, które metody autorelease obiektów, więc zwykle testuję moją drogę, która moim zdaniem jest głupia. Na przykład [data NSDate] autoreleaseuje obiekt, podobnie jak [NSArray arrayWithObjects: ...]. Skąd wiesz bez dokumentacji, która ci mówi?Jak sprawdzić, czy obiekt jest autoreleased, czy nie?

zaczynam widzieć wzór jednak, że metody, takie jak te, te, które tworzą obiekty z funkcją statycznego, zawsze zwraca autoreleased obiekt. Czy to zawsze prawda?

+0

Wierzę, że masz na myśli "metodę klasy" (w przeciwieństwie do "metody instancji") zamiast "funkcji statycznej". Jak wyjaśniono poniżej, +/- nie określa, czy zwracany obiekt jest autoreleased, jest to kwestia konwencji i prostych zasad. Większość metod zwraca obiekty, które musisz zachować - metody, które zwracają obiekt z liczbą zachowań +1, są raczej wyjątkiem, niż regułą. –

+0

Metoda klasowa, którą miałem na myśli. Użyłem "static" z terminologii java iz jakiegoś powodu "funkcji", choć powinno to być "metoda". W każdym razie są tak samo w pamięci. :) – quano

Odpowiedz

21

Zasadniczo, jeśli jesteś init, copy lub retain obiekt, który jesteś odpowiedzialny za zwolnienie go. Jeśli nie, nie ponosisz odpowiedzialności za ich zwolnienie.

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

Wiele klas zapewniają metody formie + className ..., które można wykorzystać do uzyskać nową instancję klasy. Często określane jako „Convenience konstruktorów”, te metody tworzenia nową instancję klasy, zainicjować go i odesłać go do użycia. Chociaż możesz myśleć, że jesteś odpowiedzialny za zwalnianie obiektów utworzonych w ten sposób, to nie jest to przypadek zgodnie z wcześniej ustaloną polityką własności . Ponieważ klasa tworzy nowy obiekt, to odpowiedzialny za pozbyciem się nowym obiektu.

+0

To również dobra odpowiedź. – bobobobo

4

Podpis metoda sama powie. Wzorzec do metod z sygnaturami, takimi jak "classNameWithData: data1: data2", to zwrócenie instancji alloc/init/autorelease tej rzeczy. Są to udogodnienia, więc nie musisz tego robić.

Jeśli nie chcesz, aby autorelease wersję czegoś, to nie instancję je w ten sposób, i użyć właściwego alloc/init i zwolnić, gdy skończysz. Ta metoda jest znacznie bardziej wyraźna i nieco bardziej podatna na błędy, ponieważ jeśli zostanie zgłoszony wyjątek, twój blok wydania może zostać utracony, ale jest to cena, którą płacisz za posiadanie tego w ten sposób.

+0

+1. Jeśli nie używasz metody alloc/init do pobrania obiektu, załóżmy, że jest autoodtwarzany i odpowiednio go obsługuje. – Abizern

Powiązane problemy