RetainCount OK, aby użyć w tym przypadku?

RetainCount == BAD

retainCount jest tabu, niewiarygodny, nieprzewidywalny i generalnie nie powinien być używany. Nie używam go nigdzie w moim kodzie, ale widziałem go w jednej klasie, z której korzystam w interesujący sposób.

Mam klasę, która uruchamia wątek, który działa bez końca, dopóki wątek nie zostanie anulowany. Chwyt polega na tym, że wątek zwiększa liczbę zachowań właściciela, w moim przypadku klasy, która go stworzyła. Tak więc, nawet jeśli skończyłem używać tej klasy, ta instancja nadal będzie się zawieszać, chyba że ktokolwiek zarządza moją klasą, ma również spryt, by wiedzieć, czy zamknąć wątek. To jedno rozwiązanie, ale to właśnie znalazłem w kodzie.

<code>- (oneway void)release
{
    // This override allows allows this object to be dealloced 
    // by shutting down the thread when the thread holds the last reference.
    // Otherwise, the object will never be dealloc'd
    if (self.retainCount == 2)
    {
        [self quitDispatchThread];
    }

    [super release];
}
</code>

To sprytne rozwiązanie, ale nie jestem pewien, co o tym myśleć. Zastępuje wydanie w klasie i sprawdza, czy liczba zachowań wynosi 2. Innymi słowy,sprawdza, czy wątek jest jedyną rzeczą, która utrzymuje mój obiekt przy życiu (ponieważ liczba zachowań ma zostać zmniejszona z 2 do 1), a jeśli tak, to kończy wątek (quitDispatchThread zablokuje się, dopóki wątek nie zostanie zakończony).

Więc...

Czy możesz polegać na retainCount, aby zobaczyć, czy to jest jedno?

Zwykle ludzie mówią, żeby trzymać się z dalekaretainCount ponieważ nie wiesz, czy są tam jakieś autoreleases. Jeśli jednak retainCount ma wartość jeden, to wiem, że tylko wątek utrzymuje go przy życiu i nie muszę się obawiać, że liczba retainCount może być wyłączona z powodu niektórych autorelease, itd ...

Co jest nie tak z tym kodem?

Już miałem go usunąć, ale wydaje się, że ma to sens. Inne obiekty nie muszą mieć świadomości, że moja klasa uruchamia wątek. Inne obiekty mogą bezpiecznieretain irelease lub nawetautorelease obiekt będący właścicielem wątku bez konieczności martwienia się o zamknięcie wątku, ponieważ sam się nim zajmuje.

Ten kod rzeczywiście jest czysty, co mnie zaskakuje.

Edytuj :: NSThread zachowuje mój obiekt

Liczba retencji mojego obiektu jest zwiększona przez fakt, że używam NSThread. Moim celem jesttarget iselector jest metodą, na której działa wątek.

initWithTarget: selector: object:

Zwraca obiekt NSThread zainicjowany podanymi argumentami.

(id) initWithTarget: (id) selektor celu: (SEL) obiekt selektora: (id) argument

Parametry

cel

Obiekt, do którego wysyłana jest wiadomość określona przez selektor.

selektor

Selektor wiadomości do wysłania do celu. Ten selektor musi przyjąć tylko jeden argument i nie może mieć wartości zwracanej.

argument

Pojedynczy argument przekazany do celu. Może być zero.

Wartość zwrotna

Obiekt NSThread zainicjowany podanymi argumentami.

Dyskusja

W przypadku aplikacji nieobjętych gromadzeniem śmieci selektor metody jest odpowiedzialny za utworzenie puli autorelease dla nowo odłączonego wątku i zwolnienie tej puli przed jej zamknięciem. Zebrane aplikacje nie muszą tworzyć puli autorelease.

Obiekty docelowe i argument są zachowywane podczas wykonywania odłączonego wątku. Są zwalniane, gdy nić w końcu wychodzi.

questionAnswers(2)

yourAnswerToTheQuestion