RetainCount ОК, чтобы использовать в этом случае?

RetainCount == BAD

retainCount является табу, ненадежным, непредсказуемым и, как правило, не должно использоваться. Я нигде не использую его в своем коде, но я видел его в одном классе, который я использую интересным способом.

У меня есть класс, который запускает поток, который работает бесконечно, пока поток не будет отменен. Уловка в том, что поток увеличивает количество сохраняемых данных владельца, в моем случае класс, который его создал. Таким образом, даже если я использую этот класс, этот экземпляр все еще будет зависать, если только тот, кто управляет моим классом, также не знает, что такое умение, чтобы закрыть поток. Это одно из решений, но это то, что я нашел в коде.

<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>

Это умное решение, но я не уверен, что об этом думать. Он переопределяет выпуск в классе и проверяет, равно ли число удержаний 2. Другими словами,it checks to see if the thread is the only thing keeping my object alive (так как количество сохранений должно быть уменьшено с 2 до 1), и если это так, он завершает поток (quitDispatchThread будет блокироваться, пока поток не будет прерван).

Так...

Can you rely on retainCount to see if it is one?

Обычно люди говорят, чтобы держаться подальше отretainCount потому что вы не знаете, есть ли там какие-либо авто-релизы. Однако, если retainCount равен единице, я точно знаю, что только поток поддерживает его, и мне не нужно беспокоиться о том, что retainCount может быть отключен из-за некоторых авто-выпусков и т. Д.

What's wrong with this code?

Я собирался удалить его, но на самом деле, кажется, имеет смысл. Другие объекты не должны знать, что в моем классе запущен поток. Другие объекты могут безопасноretain а такжеrelease или дажеautorelease объект, владеющий потоком, не беспокоясь о закрытии потока, потому что он заботится о себе сам.

Этот код на самом деле чувствует себя чистым, что меня удивляет.

Edit :: NSThread is Retaining my Object

Число сохраненных объектов увеличивается благодаря тому, что я использую NSThread. Мой объектtarget иselector метод, на котором работает поток

initWithTarget:selector:object:

Returns an NSThread object initialized with the given arguments.

(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument

Parameters

target

The object to which the message specified by selector is sent.

selector

The selector for the message to send to target. This selector must take only one argument and must not have a return value.

argument

The single argument passed to the target. May be nil.

Return Value

An NSThread object initialized with the given arguments.

Discussion

For non garbage-collected applications, the method selector is responsible for setting up an autorelease pool for the newly detached thread and freeing that pool before it exits. Garbage-collected applications do not need to create an autorelease pool.

The objects target and argument are retained during the execution of the detached thread. They are released when the thread finally exits.

Ответы на вопрос(2)

Ваш ответ на вопрос