【问题标题】:message sent to deallocated instance in app purchase iphone消息发送到应用购买 iphone 中的已释放实例
【发布时间】:2011-04-06 12:31:49
【问题描述】:

我已经在我的应用中实现了应用内购买,我目前面临一个严重错误,查看下面的代码

@implementation Credits


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

    if ([SKPaymentQueue canMakePayments]) {
        NSLog(@"PARENTAL CONTROL DISABLED");

        productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"com.2sms.twosmsapp.credits.1"]];
        productsRequest.delegate = self;
        [productsRequest start];
    }
    else {
        NSLog(@"PARENTAL CONTROL ENABLED");
    }


    [super viewDidLoad];

}

-(IBAction)purchase100Credits{

    SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"com.2sms.twosmsapp.credits.1"];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

    SKProduct *validProduct = nil;
    int count = [response.products count];
    if(count > 0)
    {
        validProduct = [response.products objectAtIndex:0];
    }
    else {
        NSLog(@"NO PRODUCTS AVAILIABLE");
    }

}

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

    for(SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:

                break;

            case SKPaymentTransactionStatePurchased:

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;

            case SKPaymentTransactionStateFailed:
                if (transaction.error.code != SKErrorPaymentCancelled)
                {
                    NSLog(@"AN ERROR ENCOUNTERED");
                }

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
        }
    }


}




- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}


- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [productsRequest release];
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
    [super dealloc];

}

按钮成功获取了iTunes商店的信息,但是当我离开视图然后返回它时,我收到了

-[Credits respondsToSelector:]: message sent to deallocated instance 0x1a8810

这让我很头疼!我相信这是一个内存管理问题,但我是新手,找不到问题:(

【问题讨论】:

    标签: iphone objective-c cocoa-touch ios4


    【解决方案1】:

    我遇到了同样的错误,代码中不正确的事情是当您分配和发起产品请求时:

    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet     setWithObject:@"com.2sms.twosmsapp.credits.1"]];
        productsRequest.delegate = self;
        [productsRequest start];
    

    并且在dealloc中只释放productsRequest,在真正释放之前,productsRequest可以调用delegate,视图不存在->ERROR

    防止此错误的一件事是在发布之前将委托设置为 nil:

    productsRequest.delegate = nil;
    [productsRequest release];
    

    这解决了我的问题。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我认为,在 Credit 类中,您使用的是任何已发布的实例。 检查您发布的组件。 同一案例可能有两个原因: 1.您正在使用任何实例而没有分配和初始化它。 要么 2. 您正在使用任何已经发布的实例。

      【讨论】:

        【解决方案3】:

        该错误表明您正在尝试访问已发布的内容。因此,在确定不再需要它们之前,请确保不要release 对象。在您的情况下,当您返回视图时,您正在尝试使用已释放的对象,因此请检查对象的释放。

        【讨论】:

          【解决方案4】:

          您的 Credits 对象似乎在您使用完之前就被释放了。尝试打开环境变量 NSZombieEnabled 以跟踪释放的对象以及发送给它们的消息。完成后请务必关闭 NSZombieEnabled!

          此外,如果您使用垃圾回收,请确保您始终对 Credits 对象具有强引用。如果 GC 开启,这将阻止 GC 释放和释放它。

          【讨论】:

            【解决方案5】:

            我也遇到了同样的问题,其实解决起来很简单:

             -(void)dealloc{
            
                [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
            }
            

            你不应该再收到错误了

            【讨论】:

              猜你喜欢
              • 2023-03-29
              • 2011-06-14
              • 2011-06-16
              • 2023-03-13
              相关资源
              最近更新 更多