我找到了这个答案:
https://stackoverflow.com/a/5163334/1364174
其中介绍了如何for in
循环被实现。
NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
for (NSUInteger i = 0; i < __count; i++) {
id obj = __objects[i];
[obj doSomething];
}
}
问题是,我发现这是错误的。
首先,当你打开自动引用计数(ARC)时,你会得到一个错误
Sending '__strong id *' to parameter of type '__unsafe_unretained_id*' changes retain/release properties of pointer
但即使当我关闭 ARC 时,我发现 __object 数组似乎表现得很奇怪:
这是实际代码(我假设 MAX_STACKBUFF_SIZE 为 40):
@autoreleasepool {
NSArray *myArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
int MAX_STACKBUFF_SIZE = 40;
NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
for (NSUInteger i = 0; i < __count; i++) {
id obj = __objects[i];
__enumState.itemsPtr
NSLog(@" Object from __objects ! %@", obj); // on screenshot different message
}
}
}
return 0;
当我尝试获取 __object 数组的内容时,我得到了 EXC_BAD_ACCESS。
我还发现,当您尝试迭代 __enumState.items Ptr 时,它实际上是有效的。
你能解释一下这是怎么回事吗?为什么我的__objects
看起来“缩小了”。为什么它不包含所需的对象?为什么当ARC打开时会出现这个错误?
预先非常感谢您投入的时间和精力! (我提供了屏幕截图,以便更好地理解导致错误的原因)