-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];
    }
}
4

2 に答える 2

0

より良い解決策があるかもしれませんが、デバッグにのみ使用した多かれ少なかれ同様のケースがありました。

オブジェクトを作成するとき、オブジェクトを保持するコンテナ (NSMutableSet) にも入れます。次に、リリース メソッドをオーバーライドして、オブジェクトの保持カウントを確認します。保持カウントが 1 の場合 (コンテナー配列のみが保持されている場合)、特定のスレッドでセレクターを実行して、そのコンテナー配列からオブジェクトを削除し、同じスレッドで強制的に割り当てを解除します。

ただし、別のスレッドから配列を変更しないように注意してください。

これが役立つことを願っています。

于 2013-06-10T11:17:32.753 に答える
0

私はあなたの考えを持っていると思います.....
これでそれをリリースしてみてください:

- (oneway void)releaseOnMyQueue {
    __block id temp = self;
    dispatch_async(_opQueue, ^{
        [temp release];
    });
}
于 2013-11-22T09:57:36.333 に答える