Objective-C“消息发送到解除分配的实例

时间:2014-01-25 15:59:25

标签: ios iphone objective-c in-app-purchase

我在我的视图中调用In App购买,但是当用户按下buyButton并且我不确定为什么会这样时它会一直崩溃。我得到的崩溃:

2014-01-25 15:57:54.625 MyApp[563:60b] *** -[__NSArrayI objectAtIndex:]: message sent to deallocated instance 0x1a027b50

这是我的代码:

{
    NSMutableArray *_objects;
    NSArray *_products;
    NSNumberFormatter * _priceFormatter;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [RageIAPHelper sharedInstance];
    _products = nil;
    [[RageIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) {
        if (success) {
            _products = products;
            SKProduct * product = (SKProduct *) [_products objectAtIndex:0];

            _priceFormatter = [[NSNumberFormatter alloc] init];
            [_priceFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
            [_priceFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
            [_priceFormatter setLocale:product.priceLocale];

            NSString *priceString = [_priceFormatter stringFromNumber:product.price];                    
            }
            ([[RageIAPHelper sharedInstance] productPurchased:product.productIdentifier]);
        }
    }];
}


- (void)buyButtonTapped:(id)sender {
    UIButton *buyAdButton = (UIButton *)sender;
    SKProduct *product = [_products objectAtIndex:buyAdButton.tag];
    NSLog(@"Buying %@...", product.productIdentifier);
    [[RageIAPHelper sharedInstance] buyProduct:product];
}

@end

在此崩溃

 SKProduct *product = [_products objectAtIndex:buyAdButton.tag];

1 个答案:

答案 0 :(得分:2)

这条消息来自僵尸。关闭僵尸。

如果您不使用ARC,请使用它!使用ARC,可以为您正确管理内存,从而防止出现这种情况,即将消息发送到解除分配的实例。

如果您 使用ARC,那么您通过对_products的内存管理不善来阻止它;也许您已将_products声明为弱(不安全的未保留)参考。

此外,运行分析器。它将指出这类事情的潜力。它比人类更了解记忆管理。