dispatch_once
доступно , и нет ничего плохого в размещенном вами фрагменте.
Я вижу две проблемы с остальным кодом, однако обе они связаны со строкой 194. Сначала менеджер отправляется init
дважды: один раз внутри блока dispatch_once
, а затем после в этой строке:
if(!_sharedStoreManager) {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedStoreManager = [[super allocWithZone:nil] init];
});
#if TARGET_IPHONE_SIMULATOR
NSLog(@"You are running in Simulator MKStoreKit runs only on devices");
#else
/*194*/_sharedStoreManager = [[self alloc] init];
Это плохая вещь.
Причиной этого, и, что более важно, является то, что это похоже на бесконечный цикл. В строке 194 вызываются +[MKStoreManager alloc]
, которые заканчиваются на +[MKStoreManager allocWithZone:]
, что снова вызывает +sharedManager
!
+ (id)allocWithZone:(NSZone *)zone
{
return [self sharedManager];
}
Я бы не думал, что такой цикл вызовет EXC_BAD_ACCESS, но я рекомендую удалить строку 194; это неправильно.
(я бы также порекомендовал исправить отступ для блока if
.)