0

タイマーの cancel_handler がある場合、'assign' 属性でプロパティとして宣言された ivar を直接参照してリセットできますか?それとも最初に __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);
}
4

1 に答える 1

0

ivar を問題なく参照できます。ただし、これらの参照には への暗黙的な参照が含まれselfているため、リテイン サイクルには注意する必要があります。-deallocたとえば、ivar を直接参照する場合、タイマーが呼び出されることはないため、タイマーをシャットダウンすることを期待しないでください。

于 2012-03-05T20:02:40.827 に答える