【问题标题】:SKProductsRequest deallocated, even though using ARC?SKProductsRequest 解除分配,即使使用 ARC?
【发布时间】:2012-03-19 04:48:20
【问题描述】:

我正在尝试设置 SKProductsRequest,但我不断收到错误 EXC_BAD_ACCESS。我知道这与ARC有关。 在我的 .h 文件中,我有 SKProductsRequestDelegate。

这些是我的 .m 文件中的主要功能:

- (void)requestProUpgradeProductData {
    NSSet *productIdentifiers = [NSSet setWithObject:kInAppPurchaseProUpgradeProductId];
    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];
}

#pragma mark -
#pragma mark SKProductsRequestDelegate methods

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *products = response.products;
    //proUpgradeProduct = [products count] == 1 ? [products firstObject] : nil;
    proUpgradeProduct = [products objectAtIndex:0];
    if (proUpgradeProduct) {
        NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle);
        NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription);
        NSLog(@"Product price: %@" , proUpgradeProduct.price);
        NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier);
    }

    for (NSString *invalidProductId in response.invalidProductIdentifiers) {
        NSLog(@"Invalid product id: %@" , invalidProductId);
    }

    // finally release the reqest we alloc/init’ed in requestProUpgradeProductData
    productsRequest = nil;

    [self purchaseProUpgrade];

    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];
}

当我启用 NSZombieEnabled 时,我得到的是:"-[InAppPurchaseManager respondsToSelector:]: message sent to deallocated instance."

任何帮助将不胜感激。 谢谢!

【问题讨论】:

  • 您在哪里获得了错误的访问权限? (如果您使用带有断点配置为抛出异常的调试器,您可以了解这一点)
  • 我在调用 [productsRequest start] 后获得了错误的访问权限。

标签: iphone in-app-purchase automatic-ref-counting


【解决方案1】:

我终于明白了!关键是当你合成变量时,一定要这样做:

@synthesize productsRequest = _productsRequest;

在 .h 中,它应该如下所示:

@property (nonatomic, strong) SKProductsRequest *productsRequest;

在 .m 中,确保使用“self”。使用 productsRequest 时:

self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
self.productsRequest.delegate = self;
[self.productsRequest start];

你去!

【讨论】:

  • 你还设置self.productsRequest = nil;在 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
【解决方案2】:

productsRequest[productsRequest start] 之后立即被销毁

您需要通过将productsRequest 分配给__strong ivar 或将其填充到集合、字典或数组中来强制“保留”productsRequest

【讨论】:

  • 是的,这就是我要找的。但是代码是什么?过去2个小时我一直在尝试,但无济于事..
  • 我尝试通过添加“@property (strong) SKProductsRequest *_productsRequest;”来做到这一点进入我的 .h 文件,但我仍然得到同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多