在自定义类上实现NSFastEnumeration

时间:2011-01-28 11:44:30

标签: objective-c

我有一个继承自NSObject的类。它使用NSMutableArray来保存子对象,例如人们使用NSMutableArray *项来保存Person对象。如何在项目上实现NSFastEnumerator?

我尝试过以下但是无效:

@interface People : NSObject <NSFastEnumeration>
{
    NSMutableArray *items;
}

@implementation ...

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len
{
    if(state->state == 0)
    {
        state->mutationsPtr = (unsigned long *)self;
        state->itemsPtr = items;
        state->state = [items count];
        return count;
    }
    else
        return 0;
}

2 个答案:

答案 0 :(得分:19)

您没有正确使用NSFastEnumerationState结构。请参阅NSFastEnumeration Protocol Reference并查看常量部分以查看每个字段的说明。在您的情况下,您应该将state->mutationsPtr保留为零。 state->itemsPtr应设置为对象的C数组,而不是NSArray或NSMutableArray。您还需要将相同的对象放入作为stackbuf传递的数组中。

但是,由于您使用NSMutableArray来包含要枚举的对象,因此您可以将调用转发给该对象:

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len {
    return [items countByEnumeratingWithState:state objects:stackbuf count:len];
}

答案 1 :(得分:1)

NSFastEnumeration协议,但您使用的是(不存在的)NSFastEnumerator协议。这可能是问题吗?