在iOS7 SDK中使用MRC时,以下代码不会返回共享实例。在运行时它只是挂起,它不会移动到下一行代码。
+(id)getInstance
{
static dispatch_once_t pred;
static IAPManager *inAppManager = nil;
dispatch_once(&pred, ^{
inAppManager = [[IAPManager alloc] init];
});
return inAppManager;
}
这种异常的原因是什么?这就是我打电话的方式
IAPManager *iapManager = [IAPManager getInstance];
if ([iapManager canMakePurchases]) {
[iapManager loadStore:proUpgradeProductId];
}else{
UIAlertView *aView = [[UIAlertView alloc]initWithTitle:@"" message:@"This device is not able or allowed to make payments" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[aView show];
}
答案 0 :(得分:-1)
原始的getInstance方法绝对正常(我会将其声明为返回IAPManager *,但它对它的工作方式没有任何影响)。无论身在何处,“静态”变量都会初始化。
问题很可能是从[[IAPManager alloc] init]调用getInstance。从dispatch_once内部调用dispatch_once是一个即时死锁。要找到答案,只需在dispatch_once语句中的getInstance中设置断点即可。它应该在第一次调用期间被击中一次,然后可能再次被击中,并且原始调用将在堆栈上。或者只是等到它挂起,然后检查每个线程所在的调试器。你会发现一个等待dispatch_once完成的线程。
或者,init方法可能不会返回。也许它会做一些无法完成的网络访问。要进入代码,请在块的第一行(也是唯一一行)上设置断点,即[[IAPManager alloc] init]行。达到该断点后,您可以单步执行代码。
答案 1 :(得分:-2)
在方法之外的Diclare inAppManager对象。并使用以下代码
static IAPManager *inAppManager = nil;
+(id)getInstance
{
if (nil != inAppManager) {
return inAppManager;
}
static dispatch_once_t pred;
dispatch_once(&pred, ^{
inAppManager = [[IAPManager alloc] init];
});
return inAppManager;
}
这可能对你有所帮助。
由于
萨蒂亚
答案 2 :(得分:-3)
试试这个:
+(instancetype)getInstance
{
static id inAppManager;
static dispatch_once_t pred;
dispatch_once(&pred, ^{
inAppManager = [[[self class] alloc] init];
});
return inAppManager;
}