在ios7 mrc中发出一次问题

时间:2014-03-06 06:00:20

标签: objective-c ios7

在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];
}

3 个答案:

答案 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;
}