发布版本阻止崩溃

WYS*_*WYS 3 iphone xcode objective-c ios

我有一个问题,我现在无法在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)
Run Code Online (Sandbox Code Playgroud)

audioPlayerDidFinishPlaying的方法:成功如下:

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

块设置如下:

- (void)setMusicCompletionBlock:(void (^)(void))theBlock 
{ 
    musicPlayerCompletionBlock = theBlock; 
} 
Run Code Online (Sandbox Code Playgroud)

在头文件中像这样:

void (^musicPlayerCompletionBlock) (void);
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 8

您需要在您的setter中复制块.块从堆栈开始,在复制之前不会移动到堆.

它在调试版本中"有效",因为未启用优化器,因此编译器不会积极地重用堆栈.也就是巧合.如果要在块创建和调用之间添加一个或两个方法调用,它可能会开始崩溃.

我建议你摆脱setter/getter的自定义实现,musicPlayerCompletionBlock只是声明一个属性:

typedef void(^MusicCompletionBlockType)(void);
.... 
@property(copy) MusicCompletionBlockType musicCompletionBlock;
Run Code Online (Sandbox Code Playgroud)

生成的setter/getter将负责复制块.dealloc如果不使用ARC,您可以将其释放.