今天看了个alibaba的开源库coobjc,看到了代码中使用了实现NSFastEnumeration协议的类进行for循环,顿时懵逼,嗯,现在是要把它搞懂
Enumeration: 列举
仔细看一下iOS的NSArray,其中就实现了NSFastEnumeration协议
@interface NSArray<__covariant ObjectType> : NSObject
<NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
<NSFastEnumeration>协议是个什么鬼
看代码,只包含了下边这一个方法和一个结构体NSFastEnumerationState
typedef struct {
unsigned long state;
id __unsafe_unretained _Nullable * _Nullable itemsPtr;
unsigned long * _Nullable mutationsPtr;
unsigned long extra[5];
} NSFastEnumerationState;
@protocol NSFastEnumeration
- (NSUInteger)countByEnumeratingWithState:
(NSFastEnumerationState *)state
objects:(id __unsafe_unretained _Nullable [_Nonnull])buffer
count:(NSUInteger)len;
@end
经过测试,每次进行for...in循环的时候,会自动调这个方法,那么这个方法是做什么的呢
下面进行测试,打印log
新建一个Dog类,实现<NSFastEnumeration>协议
Dog.h
@interface Dog : NSObject<NSFastEnumeration>
@end
Dog.m