将块设置为nil时的SIGSEGV

时间:2014-02-11 22:15:20

标签: objective-c objective-c-blocks

我遇到了一个难以重现的奇怪崩溃。例如,在应用程序的过去35次运行中,此次崩溃发生了一次。不幸的是,我不确定重复的确切步骤。

崩溃报告显示:

SIGSEGV
Remotely-[NetworkCall handleRequestFinished] 
in NetworkCall.m on Line 232

第232行是:

_startBlock = nil;

并且该属性定义为:

typedef void (^NetworkCallStartBlock)();
@property(copy, nonatomic) NetworkCallStartBlock startBlock;

有一次我能够重新调试附带调试器的bug,将_startBlock打印到控制台时显示其值在尝试分配nil时已经为nil。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

_startBlock = nil;更改为self.startBlock = nil 后者使你的块释放并安全地将属性设置为nil。

答案 1 :(得分:0)

JosephH上面的评论是正确的。将已经为零的值设置为nil是在self被dealloc'd之后发生的,因此它解除了引用自我的问题。这个类的dealloc没有正确设置为nil一切,所以修复解决了这个问题。感谢所有输入并跟踪它