Ios 连续两次调用dispatch_source_create()时崩溃
考虑以下代码:Ios 连续两次调用dispatch_source_create()时崩溃,ios,objective-c,grand-central-dispatch,Ios,Objective C,Grand Central Dispatch,考虑以下代码: @interface ViewController () @property (nonatomic, strong) dispatch_source_t source; @end @implementation ViewController -(void)viewDidLoad { [super viewDidLoad]; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PR
@interface ViewController ()
@property (nonatomic, strong) dispatch_source_t source;
@end
@implementation ViewController
-(void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_resume(self.source);
dispatch_source_set_timer(self.source, dispatch_time(DISPATCH_TIME_NOW, 0.2 * NSEC_PER_SEC), 0.2 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.source, ^{
NSLog(@"%s",__func__);
});
}
@end
如果我使用dispatch\u source\u create
创建相同的dispatch\u source\u TYPE\u TIMER
两次,应用程序将崩溃。为什么?
像上面的例子一样,一次创建一个分派源和两次创建分派源之间有什么区别吗
libdispatch.dylib`_dispatch_xref_dispose:
0x10015e174 <+0>: ldr w8, [x0, #48]
0x10015e178 <+4>: cmp w8, #2 ; =2
0x10015e17c <+8>: b.hs 0x10015e184 ; <+16>
0x10015e180 <+12>: ret
0x10015e184 <+16>: stp x20, x21, [sp, #-16]!
0x10015e188 <+20>: adrp x20, 41
0x10015e18c <+24>: add x20, x20, #3849 ; =3849
0x10015e190 <+28>: adrp x21, 46
0x10015e194 <+32>: add x21, x21, #2440 ; =2440
0x10015e198 <+36>: str x20, [x21]
0x10015e19c <+40>: ldp x20, x21, [sp], #16
-> 0x10015e1a0 <+44>: brk #0x1
libdispatch.dylib`\u dispatch\u xref\u dispose:
0x10015e174:ldr w8[x0,#48]
0x10015e178:cmp w8,#2=2.
0x10015e17c:b.hs 0x10015e184;
0x10015e180:ret
0x10015e184:stp x20,x21,[sp,#-16]!
0x10015e188:adrp x20,41
0x10015e18c:添加x20,x20,#3849=3849
0x10015e190:adrp x21,46
0x10015e194:添加x21、x21、#2440=2440
0x10015e198:str x20[x21]
0x10015e19c:ldp x20,x21,[sp],#16
->0x10015e1a0:brk#0x1
正如人们所说,一幅画抵得上千言万语:
基本上,您正在释放一个挂起的分派对象,它似乎是由CGD生成的
恢复第一个计时器将使崩溃消失:
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_resume(self.source);
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_resume(self.source);
正如他们所说,一幅画抵得上千言万语: 基本上,您正在释放一个挂起的分派对象,它似乎是由CGD生成的 恢复第一个计时器将使崩溃消失:
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_resume(self.source);
self.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_resume(self.source);
你为什么这么做?当您将第二个分配给同一个属性时,第一个将被释放,@Paulw11我知道这是毫无意义的代码。第一个将在分配第二个时被释放。但随后我恢复第二个。没有办法会崩溃,我认为它仍然可以正常工作,但它做到了!如何处理?这看起来像是一个时间问题,因为在处理分派对象时发生了崩溃。为什么要这样做?当您将第二个分配给同一个属性时,第一个将被释放,@Paulw11我知道这是毫无意义的代码。第一个将在分配第二个时被释放。但随后我恢复第二个。没有办法会崩溃,我认为它仍然可以正常工作,但它做到了!如何处理?这看起来像是一个时间问题,因为在处理分派对象时发生了崩溃。