stopBlock的参数允许您过早停止枚举。这等效break于普通for循环。如果要遍历数组中的每个对象,则可以忽略它。
for( id obj in arr ){
    if( [obj isContagious] ){
        break;    
    }
    if( ![obj isKindOfClass:[Perefrigia class]] ){
        continue;    
    }
    [obj immanetizeTheEschaton];
}
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if( [obj isContagious] ){
        *stop = YES;    
        return;
    }
    if( ![obj isKindOfClass:[Perefrigia class]] ){
        return;    
    }
    [obj immanentizeTheEschaton];
}];
那是一个out参数,因为它是对调用范围中变量的引用。它需要在您的Block内部进行设置,但要在中进行读取enumerateObjectsUsingBlock:,就像NSError通常将s从框架调用传递回代码一样。
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block {
    
    
    NSUInteger idx = 0;
    for( id obj in self ){
        BOOL stop = NO;
        block(obj, idx++, &stop);
        if( stop ){
            break;
        }
    }
}
     
              
stop标志是建议性的;例如,在并发情况下,枚举可能会继续进行一些不确定的迭代次数。也就是说,您不应__block在每次通过枚举时无条件地设置变量,并应将其用作stop用于提前终止的“最后一个”值。您应该始终将“否,使用此对象”与设置结合使用stop = YES;。