Я нашел такой ответ:
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, я обнаружил, что массив I __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;
Я получил EXC_BAD_ACESS, когда пытаюсь получить содержимое массива __object. Я также обнаружил, что когда вы пытаетесь перебрать __enumState.itemsPtr, он действительно работает.
Не могли бы вы объяснить мне, что здесь происходит? Почему мой __objects
кажется "съежившимся". И почему в нем нет желаемого объекта? И почему та ошибка при включении ARC.
Заранее большое спасибо за ваше время и усилия! (Я предоставил снимок экрана, чтобы лучше понять, что вызывает ошибку)
for in ___
? - person Mick MacCallum   schedule 22.12.2013for in
. - person Paul Brewczynski   schedule 22.12.2013