2013-06-10 2 views
-1

Я создал кое-что в своей операционной очереди (_opQueue), и я хочу также отпустить их в этой очереди. Вот мой код, _opQueue была создана форма «dispatch_queue_create» («Data_Serial_Operation_Queue», DISPATCH_QUEUE_SERIAL);Как выпустить мои объекты в определенной очереди?

@implementation CrowdPot  
- (void) dealloc { 
    [_queryString release],_queryString = nil; 
    [_sortedItems release],_sortedItems = nil; 
    objc_setAssociatedObject(_indexesDictionary, ctIndexDictionaryTypeKey, nil, OBJC_ASSOCIATION_ASSIGN); 
    [_indexesDictionary release],_indexesDictionary = nil; 
    [super dealloc]; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     dispatch_sync(_opQueue, ^{ 
      _sortedItems = [[NSMutableArray alloc] initWithCapacity:128]; 
      _indexesDictionary = [[NSMutableDictionary alloc] initWithCapacity:28]; 
      _initialRange = NSMakeRange(NSNotFound, 0); 
      _needRefill = YES; 
     }); 
    } 
    return self; 
} 

- (oneway void)release 
{ 
    dispatch_async(_opQueue, ^{ 
     [super release];//revise 
    }); 
} 

В методе освобождения я использую «[супер-релиз]» в блоке, который я думаю, может сохранить себя (используя ключевое слово «супер» сохранить сохранить кол SELF в). Я думаю, что это не элегантность и даже неправильная.

Затем, как написать метод выпуска, если я хочу выпустить эти данные в моем _opQueue? Это еще один способ сделать это в этом случае, кто-нибудь поможет?

Вот способ публикации данных в определенном потоке, который я получил из Интернета.

-(oneway void)release{ 
    //ensure dealloc occurs on our _addressBook thread 
    //we do this to guarantee that we are removed from the weak cache before someone else ends up with us. 
    if (_addressBookThread && ![[NSThread currentThread] isEqual:_addressBookThread]) { 
     [self performSelector:_cmd onThread:_addressBookThread withObject:nil waitUntilDone:NO]; 
    } else { 
     [super release]; 
    } 
} 
+1

А? <- Это все, что я могу сказать. Счет сохранения объекта не имеет ничего общего с потоками. Просто отпустите их, как обычно. – borrrden

ответ

0

Там может быть лучшим решением, но я был более или менее похожий случай, что я используется только для отладки, хотя:

Когда я создаю объект я также поместить его в какую-нибудь емкость (NSMutableSet), который сохраняет объект. Затем я переопределяю метод выпуска и проверяю счет сохранения объекта. Если счетчик удержания равен одному (только он сохраняет контейнер), я выполняю селектор в определенном потоке, чтобы удалить объект из этого массива контейнеров и заставить его освободиться от того же потока.

Будьте осторожны, но не изменяйте массив из другого потока.

Надеюсь, это поможет.

0

Я думаю, что я получил свою идею .....
Попробуйте выпустить его с этим:

- (oneway void)releaseOnMyQueue { 
    __block id temp = self; 
    dispatch_async(_opQueue, ^{ 
     [temp release]; 
    }); 
} 
Смежные вопросы