0
__block BOOL myBool = NO; 
__strong MyClass *ptr = self; 
self.footer.defaultSelectedItem.selectionBlock = ^{ 
    myBool = YES; 
    ptr = nil; 
}; 

Это прекрасно работает, когда Build Configuration моя схема установлен в Debug, но я получаю EXC_BAD_ACCESS когда я бегу с Release. EXC_BAD_ACCESS происходит на следующей строкеиспользование переменных в блоке из параллельного объема

if(selectionBlock != nil) selectionBlock(); 

, но если я закомментируйте все строки внутри моего selectionBlock то он работает без ошибок. Почему это выполняется в Debug, а не в выпуске?

FYI Я использую Automatic Reference Counting (дуга)

** EDIT в ответ на @RobNapier **

Исходный код, который работает в отладке является:

__block BOOL flag = NO; 
__strong EventsView *ptr = self; 
self.footer.defaultSelectedItem.selectionBlock = ^{ 
    if(flag) return; 
    flag = YES; 
    [ptr backTUI:nil]; 
    flag = NO; 
}; 
+1

Можно ли предположить из присутствия '__strong', что вы используете ARC? –

+0

Хорошая точка. Да, я использую ARC. – Jacksonkr

+1

Что такое "myObject = nil"? Возможно, вы имели в виду "ptr = nil"? Из вашего другого кода это выглядит так: «myObject» - это класс. –

ответ

0

Для жизни я не мог заставить это работать с блоком. Поэтому вместо этого я перешел к использованию установщика для указателя просмотра событий. Я предполагаю, что исправил проблему с моим указателем, настроив дополнительное сохранение ARC. Я все еще не уверен, потому что я никогда не видел, чтобы зомби регистрировался при использовании блока, так что да.

В случае сомнений используйте селектор.

1

Там в нет причин для дополнительных ptr здесь. Использование self внутри блока было бы более правильным. В этом случае блок сохранит self. Это может привести к циклу удержания, поэтому вам необходимо запомнить self.selectionBlock = nil в какой-то момент до dealloc, чтобы разбить цикл сохранения.

flag может быть оптимизирован здесь. Непонятно, как это может быть полезно из приведенного выше кода.

Я всегда очень нервничаю о длинной Косвенности-цепях в операции настройки, как этот:

self.footer.defaultSelectedItem.selectionBlock = ... 

Я хотел бы убедиться, что footer и токаdefaultSelectedItem не может исчезнуть, прежде чем это работает ,

Упростите проблему. Сделайте блок только журналом «Запуск блока». Затем добавьте обратно вещи, пока не сработает.

+0

Хотя все это имеет смысл, как получается, что это работает отлично, как в режиме отладки, но не в режиме выпуска? Я вижу, что я могу оптимизировать, но я не понимаю, почему этот код ломается только из-за изменения режима. – Jacksonkr

+0

Если ваше поведение зависит от неопределенного поведения (например, доступа к чему-то после его выпуска), тогда он может легко работать в отладке, но не в выпуске. –

+0

Я нахожу, что это определенно код внутри блока выбора, который вызывает проблему. Я запутался, потому что «я», о котором я говорю, на самом деле является «супервидео» объекта, который работает с моим блоком. Поэтому нет никакого смысла в том, что код считает, что 'self' не существует. Как это произойдет? – Jacksonkr

Смежные вопросы