【发布时间】:2012-12-07 13:44:17
【问题描述】:
我的视图控制器通过presentViewController:animated:completion: 方法呈现视图。视图呈现良好。
然后我关闭这个视图并重新呈现它并得到以下崩溃:
*** -[WebBrowser isKindOfClass:]: message sent to deallocated instance 0x1f640ac0
我的代码正在使用 ARC。这是我的 WebBrowser 类的代码,一个简单的嵌入式浏览器。
WebBrowser.h:
@interface WebBrowser : ITViewController <UIWebViewDelegate, UIAlertViewDelegate>
@property (nonatomic, strong) NSString *URL;
@property (nonatomic, weak) IBOutlet UIWebView *webView;
@property (nonatomic, weak) IBOutlet UIActivityIndicatorView *spinner;
- (id)initWithURL:(NSString *)URL;
- (IBAction)dismissView:(id)sender;
@end
WebBrowser.m:
@implementation WebBrowser
- (id)initWithURL:(NSString *)URL_ {
self = [super initWithNibName:@"MyNib" bundle:nil];
if (self) {
self.URL = URL_;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.webView.delegate = self;
if (self.URL) {
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.URL]]];
}
}
- (IBAction)dismissView:(id)sender {
self.URL = nil;
[self.webView stopLoading];
self.webView.delegate = nil;
[self dismissViewControllerAnimated:YES completion:NULL];
}
// + some non-related web view delegate stuff
@end
最后是我在父视图控制器中呈现视图的方式:
WebBrowser *browser = [[WebBrowser alloc] initWithURL:URL];
[self presentViewController:browser animated:YES completion:NULL];
我正在运行 iOS 6 并使用 ARC 进行编译。
首先我认为这个错误与 ARC 相关。这是我的原帖:
原帖
我注意到我的应用在 iOS 6.x 中显示模态视图控制器时崩溃,而当它在以前版本的 iOS 上运行良好时释放它。
怪我还没有使用 ARC(这是我在这个项目上的下一个重要步骤),但是例如,当使用以下代码显示 Game Center 排行榜时,请执行以下步骤:
- 显示排行榜
- 关闭排行榜
- 再次显示排行榜(精确更新:通过运行下面所示的相同
showLeaderboard,即显示GKLeaderboardViewController的新实例)
然后,出现以下错误
*** -[GKLeaderboardViewController isKindOfClass:]: message sent to deallocated instance 0x17467120
这是我的代码:
- (void)showLeaderboard {
if ([[GKLocalPlayer localPlayer] isAuthenticated]) {
GKLeaderboardViewController *lb = [[GKLeaderboardViewController alloc] init];
lb.category = ...;
lb.leaderboardDelegate = self;
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:lb animated:YES];
[lb release];
} else {
...
}
}
- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController{
[self dismissModalViewControllerAnimated:YES];
}
事实证明,删除 [lb release] 指令可以解决我的问题,而且 iOS 5.x 也不会发生此类崩溃。
Game Center 成就视图控制器或我的任何其他自定义视图控制器也会发生同样的情况,显示为presentModalViewController:。
似乎用新的presentViewController:animated:completion: 替换已弃用的-presentModalViewController: 指令也不能解决问题。
【问题讨论】:
-
导致错误的确切行是什么?添加异常断点。此外,添加一个 NSLog(@"Instance: %p", lb);在 presentModalViewController 行之前,并发布结果(NSLog 的实例地址和导致错误的对象的地址)
-
如果在完成处理程序中使用
presentViewController:animated:completion:并释放lb会怎样? -
ARC 也发生了同样的事情。合规,我不应该这样做。
-
我的第一条评论(2012 年 12 月:-) 已经有效:添加 NSLog(@"Instance: %p", browser);在 alloc-init 呈现浏览器和另一个在dismiss方法之后。然后,发布结果。您应该有 3 行/实例地址:1-第一个分配的启动浏览器,2-第一个关闭的浏览器,3-第二个分配的浏览器。我怀疑您的超类(ITViewController)在每个 initWithNibName 处为您提供相同的(已解除分配的)实例
-
好的。但现在问题更清楚了:在你分配初始化新实例之后,某些东西正在向旧实例发送消息。您应该尝试了解是谁 :-) 您是否能够找到导致它的确切代码行?
标签: ios ios5 ios6 modalviewcontroller