Tôi đang cố hủy và sau đó phát hành bộ hẹn giờ bị tạm dừng nhưng khi tôi gọi 'dispatch_release' trên đó, tôi ngay lập tức nhận được EXC_BAD_INSTRUCTION.dispatch_source_cancel trên bộ hẹn giờ bị tạm dừng khiến EXC_BAD_INSTRUCTION
Đây có phải là tập hợp hành động hợp lệ để thực hiện hẹn giờ không?
tạo Hẹn giờ & treo:
@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, ^{
// Perform a task
// If a particular amount of time has elapsed, kill this timer
if (timeConstraintReached)
{
// Can I suspend this timer within it's own event handler block?
dispatch_suspend(_timer);
}
});
dispatch_resume(_timer);
}
- (void)resetTimer
{
dispatch_suspend(_timer);
dispatch_source_cancel(_timer);
// dispatch_release causes
// 'EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
dispatch_release(_timer);
self.timer = nil;
}
@end
Ngoài ra, tôi có thể gọi dispatch_suspend trong khối event_handler một nguồn hẹn giờ không?
Mọi trợ giúp sẽ được đánh giá cao.
Tôi hiểu rồi. Bởi vì mỗi dispatch_suspend 'gia tăng số lượng đình chỉ của đối tượng', phải có một 'dispatch_resume' để cân bằng việc đình chỉ. –
Có khả thi để hủy bỏ hoặc đình chỉ bộ đếm thời gian trong khối event_handler của nó hoặc điều đó có xảy ra bên ngoài khối không? –
Đúng vậy. Xem câu trả lời cập nhật của tôi. Trong khi các tài liệu không thực sự nhà nước (mà tôi có thể tìm thấy) mà bạn không thể phát hành khi nó bị đình chỉ, tôi nghi ngờ nó có một số trạng thái nội bộ gây ra badness nếu bạn đã làm. – mattjgalloway