C如何自己实现一个for(2)

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id*)stackbuf count:(NSUInteger)len
{
    // 我们用state来表示状态。状态为1返回零,说明迭代结束;若状态为0,则继续迭代
    // state初始值为零
    if(state->state > 0)
        return 0;
   
    // mutationsPtr不能为空,如果假定在枚举过程中不发生修改,一般指向self
    state->mutationsPtr = (unsigned long*)self;
   
    // 我们将当前剩余长度放在state的extra[0]之中
    NSUInteger retCount = state->extra[0];
   
    // 所要枚举的数组指针首地址;extra[1]起始值为零
    state->itemsPtr = &mNumbers[state->extra[1]];
   
    // 若为零,说明这是第一次迭代
    if(retCount == 0)
        retCount = [mArray count];
   
    // 这里需要判断当前数组长度是否超过了本次枚举所设置的最大长度
    if(retCount > len)
    {
        // 设置extra[0],存放剩余所要枚举的元素个数
        state->extra[0] = retCount - len;
       
        // 设置extra[1],存放后一次枚举起始元素索引
        state->extra[1] += len;
       
        retCount = len;
    }
    else
    {
        // 若剩余所要枚举的元素个数小于最大限制个数,则状态变1,使得后一次迭代能直接结束
        state->state++;
    }
   
    // 返回这次所要枚举的数组一共含有多少元素
    return retCount;
}

@end


int main (int argc, const char * argv[])
{
    @autoreleasepool
    {
        // insert code here...
       
        MyIterator *it = [[MyIterator alloc] init];
       
        NSLog(@"The elements are: ");
        for(NSNumber *num in it)
            printf("%ld  ", [num integerValue]);
        puts("\n");
       
        [it release];
       
        MyFastIterator *iter = [[MyFastIterator alloc] init];
       
        NSLog(@"The elements are: ");
       
        for(NSNumber *num in iter)
        {
            printf("%ld  ", [num integerValue]);
        }
        puts("");
       
        [iter release];
    }
   
    return 0;
}

Objective-C中@property的所有属性详解

Objective-C 和 Core Foundation 对象相互转换的内存管理总结

使用 Objective-C 一年后我对它的看法

10个Objective-C基础面试题,iOS面试必备

Objective-C适用C数学函数 <math.h>

好学的 Objective-C 高清PDF

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2cf275bee1245aca1ecaaad434b7728d.html