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

这是NSFastEnumerationState来自 Apple 标头的 的定义:

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

1 回答 1

1

史蒂文,

为什么要尝试使用 C 语言结构来保存这些项目,而不是在要为其构建枚举器的类中将它们设为私有 ivars?让它们成为 ivars,问题就不存在了。

安德鲁

于 2012-10-13T12:43:34.383 回答