Блокировка сбоя при выпуске

У меня проблема, которую я не смог решить за 2 дня, и это происходит только в сборке релизов. У меня нет проблем, когда я запускаю ее в сборке отладки.

Но я думаю, что это из-за блока, который не выполняется. У меня есть отчет о сбоях:

3 libdispatch.dylib 0x375d1c34 _dispatch_Block_copy + 8 4 libdispatch.dylib 0x375dc4ca dispatch_async$VARIANT$up + 6 5 Koldkrigsspionen 0x00020ef2 -[NOAudioManager audioPlayerDidFinishPlaying:successfully:] (NOAudioManager.m:807) 

Метод audioPlayerDidFinishPlaying: успешно выглядит следующим образом:

 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { if (musicPlayerCompletionBlock) dispatch_async(dispatch_get_main_queue(), musicPlayerCompletionBlock); } 

Блок устанавливается следующим образом:

 - (void)setMusicCompletionBlock:(void (^)(void))theBlock { musicPlayerCompletionBlock = theBlock; } 

Подобно этому в файле заголовка:

 void (^musicPlayerCompletionBlock) (void); 

One Solution collect form web for “Блокировка сбоя при выпуске”

Вам нужно скопировать блок в сеттер. Блоки запускаются в стеке и не перемещаются в кучу до тех пор, пока не будут скопированы.

Он «работает» в отладочных сборках, потому что оптимизатор не включен и, таким образом, компилятор не агрессивно повторно использует стек. Т.е. это работает по совпадению. Если вы хотите добавить вызов метода или два между созданием блоков и вызовом, это, вероятно, начнет сбой.

Я бы порекомендовал вам избавиться от пользовательских реализаций setter / getter для musicPlayerCompletionBlock и просто объявить свойство:

 typedef void(^MusicCompletionBlockType)(void); .... @property(copy) MusicCompletionBlockType musicCompletionBlock; 

Сгенерированный сеттер / геттер позаботится о копировании блока. Вы можете освободить его в dealloc , если не используете ARC.

  • Как запустить iOS .app-пакет в Simulator?
  • Файл GTMSessionFetcher.h не найден, обновив приложение до последнего google-api-objectivec-client
  • Как оживить просмотр влево / вправо с помощью UISwipeGestureRecognizer
  • Проблемы с настройками проекта Cocoapods
  • Xcode 9.1 - сломанные игровые площадки
  • CLLocationDegrees для переменной String в Swift
  • Попытка сохранить на plist, когда приложение завершается
  • Xcode 4.2 "идентификатор повторного использования ячеек в nib (Cell) не соответствует идентификатору, используемому для регистрации nib (ThisCell)"
  • Как добиться динамической маскировки UIView?
  • Как изменить тип объекта типа plist на NSArray в Xcode 4
  • Xcode 7.3.1 с поддержкой iOS 10
  • Interesting Posts

    Значения CMDeviceMotion нестабильны, когда iPhone вертикальный

    стереозапись на iPhone

    NSOperation с зависимостью от другой операции в другой очереди не запускается

    Ошибка утверждения в –

    Как перезагрузить или перезагрузить приложение для iPhone программно в iOS

    Не удалось найти действительный профиль подготовки, соответствующий идентификатору приложения ''

    Как закрыть задачи OpenGL в applicationWillResignActive?

    Что такое libswiftRemoteMirror.dylib и почему он включен в мой комплект приложений?

    Как правильно масштабировать изображение с фиксированной шириной и автоматической компоновкой?

    Анимировать изменение координат аннотации MapKit в Swift?

    Является ли логотип Bluetooth доступным как персонаж на iPhone?

    Фиксированные шарниры SpriteKit

    Использование Unity3D в одном из представлений приложения iOS

    Изменение цвета кнопки «Назад» на панели навигации

    iOS> «id» против NSObject

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.