0

ビュー コントローラ オブジェクトの解放中にアプリがクラッシュします。これが私のコードです。

TagCloudWebViewController *controller=[[[TagCloudWebViewController alloc]init]autorelease];
controller.htmlString=[[notification userInfo] valueForKey:@"url"];
[self.navigationController pushViewController:controller animated:YES];

これは、上記のメソッドが呼び出されたときの私のコードです

-(void)viewDidLoad{
 [super viewDidLoad]; 
[[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(openTextInWebview:) name:@"kTouchTextUrl" object:Nil];
}

#pragma mark - UIGestureDelegate
- (void)longPressRecognized:(UILongPressGestureRecognizer *)longPressRecognizer {
CGPoint touchPoint = [longPressRecognizer locationInView:self];
NSArray *subviews = self.subviews;
for (int i=0; i<subviews.count; i++) {
    TagView * tagLabel = (TagView *)[subviews objectAtIndex:i];

        if ( CGRectContainsPoint( [tagLabel frame], touchPoint ) ) {
            NSArray*objectArray=[[[NSArray alloc] initWithObjects:tagLabel.customLink, nil] autorelease];
            NSArray*keyArray=[[[NSArray alloc] initWithObjects:@"url",  nil] autorelease];
            NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:objectArray forKeys:keyArray ];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"kTouchTextUrl" object:nil userInfo:userInfo];
            //[[UIApplication sharedApplication] openURL:[NSURL URLWithString: tagLabel.customLink]];
            break;
        }
    }
}

これが通知方法です

DidLoad メソッド

- (void) viewDidLoad {
[super viewDidLoad];

    _webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    _webView.delegate = self;
    _webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth
                                 | UIViewAutoresizingFlexibleHeight);
    _webView.scalesPageToFit = YES;
    [self.view addSubview:_webView];

    [self initSpinner];

    if (htmlString) {
        [self openURL:[NSURL URLWithString:htmlString]];
    }
}

WebView デリゲート メソッド

-(void) webViewDidStartLoad:(UIWebView *)webView {
self.navigationItem.title = @"Loading...";
[spinnerView startAnimating];  
isLoading = YES;

}

-(void) webViewDidFinishLoad:(UIWebView*)webView {
self.navigationItem.title = [_webView stringByEvaluatingJavaScriptFromString:@"document.title"];
[self performSelector:@selector(stopSpinner) withObject:nil afterDelay:0.1]; 
isLoading = NO;
}

-(void) webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error {
[self webViewDidFinishLoad:webView];
[self performSelector:@selector(stopSpinner) withObject:nil afterDelay:0.1]; 
isLoading = NO;
}
  • (void) openURL:(NSURL*)URL { NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL]; [_webView loadRequest:リクエスト]; }
4

3 に答える 3

1

更新:次の回答は、withaが表示されなかっUIViewControllerた理由に関する最初の質問に対する回答UIWebViewです。OPの当初の理論は、ViewControllerオブジェクトの早期リリースに関する問題に関連しているというものでした。しかし、以下の私の回答で概説されているように、問題はViewController自体の作成に関連していると思われます。とにかく、元の質問に対する私の答えは次のとおりです(ただし、残念ながら、改訂された質問とは何の関係もありません)。

私は個人的に、問題がコントローラーのリリースに関係しているとは思わない。コントローラーのビューの作成にあると思います。上記のコードには、オブジェクトが解放される原因となるものは何もないため、問題は他の場所にあり、さらにコードを表示する必要があります。通知センターの問題が心配な場合は、それをバイパスして、 TagCloudWebViewControlleralloc / init、設定htmlString、プッシュを行うボタンを追加して、それでもプログラムがクラッシュするかどうかを確認してください。

allocとを使用してコントローラーを作成していることに気付きましたが、は作成してinitいませんinitWithNibNamedUIViewControllerクラスリファレンスによると:「ストーリーボードまたはnibファイルでビューを定義できない場合は、loadViewメソッドをオーバーライドして、ビュー階層を手動でインスタンス化し、ビュープロパティに割り当てます。」

したがって、最終的には、NIBを使用するか、ストーリーボードを使用するか、を定義し loadViewます。を定義しviewDidLoadても、の必要性が排除されるわけ ではありませんloadView。コントローラのビューを作成する必要があります。これは、NIBまたはストーリーボードを使用する場合は自動的に作成され、NIBまたはストーリーボードをloadView使用しない場合はを介して手動で作成する必要があります。

iPhone SDKを参照してください :loadViewとviewDidLoadの違いは何ですか?viewDidLoadと の違いについてはloadView

于 2012-08-23T09:30:02.867 に答える
0

クラッシュの原因となるものは何も見当たりません。質問を変更したと思います。質問によると、どこでも ViewController を使用していません。詳細を表示してください。

更新:自動解放されたオブジェクトを作成していることを確認してください。誤っていくつかの場所を解放している可能性があります。自動解放されたオブジェクトはプールとそれ以降のリリースに残るため、メモリの問題が発生する可能性があるため、回避してください。

于 2012-08-23T07:29:24.623 に答える
0

上記の問題は、WebView デリゲートが原因で発生します。戻るボタンを押した後、viewcontroller オブジェクトの解放中にこのアプリがクラッシュするため、オブジェクトの参照がメモリから解放されます。私はいくつかのようなことをしました

-(void) viewDidDisappear:(BOOL)animated{
if([_webView isLoading]) {
    [_webView stopLoading];
}
[_webView setDelegate:nil];

}

上記のコードにより、私のクラッシュは解決されました

于 2012-08-24T07:15:19.173 に答える