Сбой при неправильном доступе при объявлении блоков внутри вызовов методов

Мы работали над некоторым кодом, который вызывал метод перечисления:

- (void)enumerateRangesOfString:(NSString*)string usingBlock:(void (^)(const NSRange range, volatile BOOL * const stop))block;

Все это работало нормально, пока мы не перешли на ARC.

Когда мы посмотрели на код, который его вызывал, приложение перестало падать, если мы однозначно объявили блок:

id block = ^(const NSRange range, volatile BOOL * const stop) {
                [solutions_ addObject:object];
            };

[[puzzle_ stringForSolution:solution enumerateRangesOfString:word usingBlock:block];

Когда блок был объявлен в строке вызова метода, приложение вылетало. Мы (я) на самом деле не знали, почему это решит проблему, но я согласился с этим, потому что не хотел продолжать биться головой о стену.

Проблема в том, что это похоже на каждое встроенное объявление блоков при вызове метода. Мое приложение продолжало падать после того, как я добавил в приложение библиотеку AFNetworking. Проблема в том, что я действительно не хочу проходить и менять весь код этой библиотеки, я предполагаю, что с моим кодом что-то не так. Эта проблема продолжает вызывать сбои, когда я оставляю блоки, объявленные встроенными, а не когда я вытаскиваю блок и объявляю его отдельно.

Я использую AFNetworking в паре других приложений. Очевидно, все мы знаем, что блоки можно объявлять встроенными. Что приводит меня к выводу, что ошибка не в вызове метода, а где-то в этом проекте, который падает.


person Joshua    schedule 25.09.2012    source источник
comment
Можете показать код сбоя?   -  person newacct    schedule 25.09.2012


Ответы (1)


Я почти уверен, что основной причиной вашей проблемы является ваш параметр блока, который действительно выходит за рамки, когда этот метод возвращается. Насколько я понимаю, классы Apple, которые принимают параметр блока, сразу же выполняют функцию block_copy() в ivar (т.е. блок foo = block_copy(параметр)).

person David H    schedule 25.09.2012