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 
    }); 
} 

"[슈퍼 릴리스]"나는 (자체의 유지 수를 유지 키워드를 사용하여 '슈퍼') 자체를 유지하는 것 같아요 블록,있다. 나는 그것이 우아함 구현이 아니라 심지어 잘못된 것이라고 생각한다.

그런 다음 내 _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)를 넣어를하는 개체를 유지합니다. 그런 다음 릴리스 메서드를 재정의하고 개체의 보유 개수를 확인합니다. retain count가 1이면 (컨테이너 배열 만이 보유하고 있음) 특정 스레드에서 선택기를 수행하여 해당 컨테이너 배열에서 객체를 제거하고 동일한 스레드에서 할당 해제되도록합니다.

다른 스레드에서 배열을 수정하지 않도록주의하십시오.

이 정보가 도움이되기를 바랍니다. 내가 당신의 생각이있어 생각

0

.....
이 그것을 풀어보십시오 :

- (oneway void)releaseOnMyQueue { 
    __block id temp = self; 
    dispatch_async(_opQueue, ^{ 
     [temp release]; 
    }); 
} 
관련 문제