dispatch_source_set_cancel_handler и присвоение nil @property ivar - PullRequest
0 голосов
/ 05 марта 2012

Если у вас есть обработчик cancel_handler для таймера, можете ли вы напрямую ссылаться и сбрасывать любые ивары, объявленные как свойство с атрибутом 'assign', или вам нужно сначала назначить его как __block?

@interface SomeClass: NSObject { }
@property (nonatomic, assign) dispatch_source_t             timer;
@end

// Class implementation
@implementation SomeClass

@synthesize timer = _timer;
- (void)startTimer 
{
    dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 
                                    0, 0, globalQ); 

    dispatch_time_t startWhen = dispatch_walltime(DISPATCH_TIME_NOW, NSEC_PER_SEC * 1);
    dispatch_source_set_timer(_timer, startWhen, 1 * NSEC_PER_SEC, 5000ull);

    dispatch_source_set_event_handler(_timer, ^{
        // timer's event handler    
    });

    // VERSION 1:
    // Is it okay to reference and assign self.timer to nil 
    // or does it have to be declared as __block as in VERSION 2?
    dispatch_source_set_cancel_handler(_timer, ^{
        dispatch_release(_timer);                
        self.timer = nil;
    });


    // VERSION 2:
    __block myTimer = self.timer;
    dispatch_source_set_cancel_handler(_timer, ^{
        dispatch_release(myTimer);        

        myTimer = nil;
    });

    dispatch_resume(_timer);
}

1 Ответ

0 голосов
/ 06 марта 2012

Вы можете ссылаться на ивары просто отлично.Однако эти ссылки содержат неявную ссылку на self, поэтому вам следует остерегаться циклов сохранения.Например, если вы ссылаетесь на ivar напрямую, не ожидайте выключения таймера в -dealloc, потому что он никогда не будет вызван.

...