操作キュー (_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];
}
}