我正在尝试将dispatch_queue_t
添加到NSMutableArray
,如此:
NSMutableArray* queuesWaitingForTargetQueue = (__bridge NSMutableArray*)dispatch_queue_get_specific(targetQueue, WAITING_QUEUE_LIST_KEY);
NSLog(@" dispatch_get_current_queue() = %#x", (unsigned int)dispatch_get_current_queue());
NSLog(@" dispatch_get_main_queue() = %#x", (unsigned int)dispatch_get_main_queue());
NSLog(@" currQueueId = %#x", (unsigned int)currQueueId);
NSLog(@" queuesWaitingForTargetQueue = %#x (%@)", (unsigned int)queuesWaitingForTargetQueue, NSStringFromClass([queuesWaitingForTargetQueue class]));
[queuesWaitingForTargetQueue addObject:(__bridge id)currQueueId];
最后一行有时会因EXC_BAD_ACCESS而失败:
Thread 1: EXC_BAD_ACCESS (code=1, address=0xc08314eb)
虽然输出是:
dispatch_get_current_queue() = 0x2879640
dispatch_get_main_queue() = 0x2879640
currQueueId = 0x2879640
queuesWaitingForTargetQueue = 0x8672ae0 (__NSArrayM)
这里可能有什么问题?
答案 0 :(得分:0)
您的内存管理将成为一个真正的问题 - 您的崩溃几乎肯定是指向以前发布的对象的指针。如果你真的需要移动数组,那么使用从id到CFType(如CFMutableDictionary)的高级桥接转换(CFBridging ...)来回移动它,然后使用CF对象作为关键字。完成后,CF发布CF对象。
答案 1 :(得分:0)
嗯,不。
如果查找正在使用的各种方法的返回类型,例如dispatch_get_current_queue(),它们将返回dispatch_queue_t类型的值。如果您查找dispatch_queue_t,文档会说:
dispatch_queue_t调度队列是一个轻量级对象 您的应用程序提交块以供后续执行。
typedef struct dispatch_queue_s * dispatch_queue_t;
这是一个结构。结构不是对象。 NSArrays只能保存对象。