【发布时间】:2012-08-11 17:10:12
【问题描述】:
我的视图控制器上有一个按钮,用于显示我的应用内购买商店。
storeSinglePlayer *ssp = [[storeSinglePlayer alloc] initWithNibName:@"storeSinglePlayer" bundle:nil];
//Animation Code
CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController pushViewController:ssp animated:NO];
导航控制器成功将这个商店推送到屏幕上。商店有一个执行以下代码的后退按钮:
[self.request cancel];
self.request.delegate = nil;
self.request = nil;
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[self.navigationController popViewControllerAnimated:NO];
这也成功执行。但是,如果我现在再次单击按钮以显示商店视图控制器,我会收到以下消息:
-[storeSinglePlayer respondsToSelector:]: message sent to deallocated instance 0xd642df0
这确实是一个非常著名的问题。正如您将在上面的代码中注意到的那样,我已经合并了我在 stackoverflow 上遇到的各种帖子的建议。已实现以下代码:
[self.request cancel];
self.request.delegate = nil;
self.request = nil;
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
我的属性和相应的合成设置为:
@property (nonatomic, strong) SKProductsRequest *request;
@synthesize request = _request;
我不知道,为什么会崩溃!
P.S:该项目已启用 ARC。
【问题讨论】:
-
确保你没有发布它两次..?还是你在使用 arc..?
-
抛出异常时查看堆栈可能很有用。如果您自己不调用
respondsToSelector:,则可能会在将ssp用作某种代表时发生这种情况。 -
您遇到的例外是一个非常普遍的例外; 您需要使用调试器设置断点以在抛出异常时停止。 然后您可以查看调用堆栈(正如 Phillip Mills 建议的那样)并找出您的代码正在做什么来触发异常. 那么我们将有足够的信息来解决这个问题。
-
@benzado:我使用代码处理多个方向:[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"storeSinglePlayerLandscape"] owner:self options:nil]; [self viewDidLoad];会不会是这个问题造成的?
标签: iphone objective-c ios