実行中のブロックへの参照を保持する変数の割り当て解除が原因でクラッシュしました。コード例は次のとおりです。
これは、リリースで現在間違っていることです。同じデバイスでのデバッグでは正常に実行されます。クラッシュするには、アドホックとして実行する必要があります。
- (void)test {
_test = [self doLater:^{
_count++;
[self test];
} :3];
}
これは NSObject カテゴリで定義されています。
- (DoLaterProcess *)doLater:(void (^)())method :(double)delay {
return [[DoLaterProcess new] from:method :delay];
}
使用されたクラスの実装を終了します:
@implementation DoLaterProcess {
id _method;
BOOL _stop;
}
- (void)methodToPerform:(void (^)())methodToInvoke {
if (_stop)return;
if (NSThread.isMainThread) methodToInvoke();
else [self performSelectorOnMainThread:@selector(methodToPerform:) withObject:methodToInvoke waitUntilDone:NO];
}
- (DoLaterProcess *)from:(void (^)())method:(NSTimeInterval)delay {
[self performSelector:@selector(methodToPerform:) withObject:method afterDelay:delay];
_method = method;
return self;
}
- (void)stop {
_stop = YES;
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(methodToPerform:) object:_method];
}
@end
したがって、_test 変数の割り当てが解除され、その中で割り当てが解除されている間におそらくブロックされることを理解していますか? それがクラッシュする理由ですか?しかし、デバッグでクラッシュしないのはなぜですか?デバッグでもコンパイラを強制的にクラッシュさせることはできますか? ありがとうございました。