2012-03-27 88 views
0

我猜测,因为这代码辜负我的iOS4的设备上这必须是新的功能,做工精细的iOS5上。我需要这两个工作。我还没有搬到iOS5,但我仍然需要支持iOS4,所以我不知道如何解决这个问题?获得EXC_BAD_ACCESS,而不是在iOS 5中

static dispatch_once_t oncePredicate; 
dispatch_once(&oncePredicate, ^{ //EXC_BAD_ACCESS 
    _sharedStoreManager = [[super allocWithZone:nil] init];    
}); 

这是一个从https://github.com/MugunthKumar/MKStoreKit/blob/master/MKStoreManager.m

+0

'dispatch_once'可在iOS 4.0及更高版本。你能提供更多关于坠机的信息吗? – 2012-03-27 21:16:29

+1

你能告诉我们你的回溯? – 2012-03-27 21:21:08

回答

4

dispatch_once()是不是新的iOS 5.0,它已经出现自4.0。我用它所有的时间在目标4.0的应用程序,比如从我的框架之一这个单:

+ (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; 
{ 
    static dispatch_once_t pred; 
    static GPUImageOpenGLESContext *sharedImageProcessingOpenGLESContext = nil; 

    dispatch_once(&pred, ^{ 
     sharedImageProcessingOpenGLESContext = [[GPUImageOpenGLESContext alloc] init]; 
    }); 
    return sharedImageProcessingOpenGLESContext; 
} 

Apple's documentation

可用性

可提供的iOS 4.0然后。

我猜你的问题存在于_sharedStoreManager的-init内。例如,你在那里使用-allocWithZone:有什么原因吗?

1

dispatch_onceis available,并没有什么错,你已经发布的片段。

我看到两个问题的代码的其余部分,不过,从两行所产生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块的缩进。)

2

这是通过我的代码中的错误造成的,我已经推了修复它。更新你的子模块。感谢Brad Larson通知我。

相关问题