SKProductsRequest освобожден, хотя и с использованием ARC? - PullRequest
3 голосов
/ 19 марта 2012

Я пытаюсь настроить 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."

Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 2 ]

4 голосов
/ 22 марта 2012

Я наконец понял это!Ключ в том, что когда вы синтезируете переменную, убедитесь, что вы сделали это следующим образом:

@synthesize productsRequest = _productsRequest;

И в .h это должно выглядеть так:

@property (nonatomic, strong) SKProductsRequest *productsRequest;

В.м, обязательно используйте «я».при использовании productsRequest:

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

Вот, пожалуйста!

1 голос
/ 19 марта 2012

productsRequest уничтожается сразу после [productsRequest start]

Вам нужно принудительно «сохранить» productsRequest, присвоив его __strong ивару или заполнив его в наборе, дикте или массиве.

...