presentViewController:animated:completion:
私のView Controllerは、メソッドを介してビューを提示しています。ビューはうまく表示されます。
次に、このビューを閉じて再表示すると、次のクラッシュが発生します。
*** -[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 では正常に動作していたのに、モーダル ビュー コントローラーを表示してリリースすると、iOS 6.x でアプリがクラッシュすることに気付きました。
まだ ARC を使用していないのは私のせいです (これは、このプロジェクトの次の大きなステップです)。
- リーダーボードを表示する
- リーダーボードを閉じる
- リーダーボードを再度表示します (PRECISION UPDATE: 以下に示すものと同じものを実行します。つまり、 の新しいインスタンスを
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:
。
また、deprecated-presentModalViewController:
命令を新しい命令に置き換えてもpresentViewController:animated:completion:
問題は解決しないようです。