2013-11-21 4 views
2

Я пытаюсь добавить dispatch_queue_t к NSMutableArray так:Может ли 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) 

Что здесь может быть не так?

+3

Возможный дубликат [Что лучше всего поставить c-struct в NSArray?] (Http://stackoverflow.com/questions/4516991/whats-the-best-way-to-put-ac-struct -в-ан-NSArray). 'dispatch_queue_t' - это просто структура C. – rmaddy

+1

BTW - используйте '% p' (без трансляций) для указателей на запись. – rmaddy

+1

@rmaddy: 'dispatch_queue_t' на самом деле объект Objective-C, см. Http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues. –

ответ

0

Ваше управление памятью будет настоящей проблемой здесь - ваш сбой почти наверняка является указателем на ранее выпущенный объект. Если вам действительно нужно переместить массив вокруг, то переместите его назад и вперед, используя переходы моста высокого уровня (CFBridging ...) с id на CFType (например, CFMutableDictionary), а затем используйте объект CF в качестве ключа. Когда это будет сделано, CFRelease - объект CF.

0

Ну, нет.

Если вы посмотрите тип возврата различных методов, которые вы используете, например dispatch_get_current_queue(), они возвращают значение типа dispatch_queue_t. Если вы посмотрите dispatch_queue_t, документы говорят:

dispatch_queue_t Очередь отправки является легким объектом, к которому приложение представляет блоки для последующего выполнения.

typedef struct dispatch_queue_s * dispatch_queue_t;

Это структура. Структуры не являются объектами. NSArrays может содержать только объекты.

+4

'dispatch_queue_t' на самом деле объект Objective-C, см. Http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues: *« Начиная с iOS 6.0 SDK и SDK Mac OS X 10.8, каждый объект отправки (включая dispatch_queue_t) также является объектом Objective-C. » –

+0

Я думаю, что этот ответ вместе с комментарием Мартина является лучшим объяснением для меня. Я заметил, что мой код работает в iOS 7 Simulator, но не в iOS 5.1 Simulator. Спасибо вам обоим! Я настрою свой код, чтобы он работал в обеих версиях. –

Смежные вопросы