我制作了一个名为的宏smartFor
,它允许您进行与 for 循环快速枚举相同的设置,但可以处理数组的修改。它利用了一些 C 和 CLANG 漏洞利用,非常简单和干净。
宏:
///Allows for modifying an array during virtual fast enumeration
#define smartFor(__objectDeclaration, __array, __block) {\
int __i = 0;\
while (__i < __array.count) {\
__objectDeclaration = __array[__i];\
NSObject *__object = __array[__i];\
[__block invoke];\
if ([__array indexOfObjectIdenticalTo:__object] != NSNotFound && ((int)[__array indexOfObjectIdenticalTo:__object]) <= __i) {\
__i = ((int)[__array indexOfObjectIdenticalTo:__object])+1;\
}\
}\
}
它会自动处理您可能会做的所有 [基本] 不稳定的事情,例如添加对象(在数组中的任何位置,在“快速枚举” [1]期间的任何时间点)、删除对象、调整对象的索引、修改对象等.
示例用法:
smartFor(NSNumber *aNumber, myArray, ^{
if ([aNumber isEqualToNumber:@(3)]) {
[myArray removeObjectIdenticalTo:aNumber];
}
});
[1]注意:显然,在严格的定义/性能基础上,它在技术上并不是快速枚举,但在所有意图和目的上都表现得像它一样