3

NSFastEnumerationStateの余分な配列にいくつかのオブジェクトインスタンスを安全に保存するにはどうすればよいですか?

ループの実行中はこれらのアイテムを保持し、ループが完了したら解放する必要があります。

- (NSUInteger)countByEnumeratingWithState: (NSFastEnumerationState *)state
                                  objects: (__unsafe_unretained id *)stackbuf
                                    count: (NSUInteger)len {
    unsigned long days = 0;
    id current = nil;
    id components = nil;
    if (state->state == 0)
    {
        current = [NSCalendar currentCalendar];
        state->mutationsPtr = &state->extra[0];
        components = [current components: NSDayCalendarUnit fromDate: _startDate toDate: _endDate options: 0];
        days = [components day];
        state->extra[0] = days;
        state->extra[1] = (uintptr_t)(__bridge void *)current;
        state->extra[2] = (uintptr_t)(__bridge void *)components;
    } else {
        days = state->extra[0];
        current = (__bridge NSCalendar *)(void *)(state->extra[1]);
        components = (__bridge NSDateComponents *)(void *)(state->extra[2]);
    }
    NSUInteger count = 0;
    if (state->state <= days) {
        state->itemsPtr = stackbuf;
        while ( (state->state <= days) && (count < len) ) {
            [components setDay: state->state];
            stackbuf[count] = [current dateByAddingComponents: components toDate: _startDate options: 0];
            state->state++;
            count++;
        }
    }
    return count;
}

NSFastEnumerationStateApple のヘッダーからの , の定義は次のとおりです。

typedef struct {
    unsigned long state;
    id __unsafe_unretained *itemsPtr;
    unsigned long *mutationsPtr;
    unsigned long extra[5];
} NSFastEnumerationState;
4

1 に答える 1

1

スティーブン、

列挙子を構築しているクラスでプライベート ivar にするのではなく、これらの項目を保持するために C 言語構造を使用しようとしているのはなぜですか? それらをivarにすれば、問題は存在しません。

アンドリュー

于 2012-10-13T12:43:34.383 に答える