我找到了这个答案:
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_ACESS。我还发现,当您尝试遍历 __enumState.itemsPtr 时,它确实有效。
你能解释一下这里发生了什么吗?为什么我的__objects
似乎被“缩小”了。为什么它不包含所需的对象?以及为什么在打开 ARC 时会出现该错误。
非常感谢您的时间和精力!(我提供了屏幕截图以便更好地了解导致错误的原因)