可以将dispatch_queue_t添加到NSMutableArray吗?

时间:2013-11-21 19:50:41

标签: ios objective-c nsmutablearray grand-central-dispatch

我正在尝试将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)

这里可能有什么问题?

2 个答案:

答案 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只能保存对象。