Ищите указатели на то, как отладить «сообщение, отправленное на освобожденный экземпляр» - PullRequest
1 голос
/ 30 мая 2011

Я получаю следующую ошибку:

* - [URLViewController responsedsToSelector:]: сообщение отправлено освобожденному экземпляру 0xdb5c3b0

и я не совсем понимаю, как начать отлаживать это. Может, кто-нибудь подскажет, с чего начать?

Вот код, если вы хотите увидеть. На самом деле это перехватчик URL, так что все ссылки открываются в presentModalViewController

- (BOOL)openURL:(NSURL *)url{
    URLViewController * web = [[URLViewController alloc] init];
    web.url = url;
    UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:web];
    [nav.navigationBar setTintColor:[UIColor blackColor]];
    [nav setModalPresentationStyle:UIModalPresentationFormSheet];
    [self.detailViewController presentModalViewController:nav animated:NO];
    [web release];
    [nav release];
    return YES;
}

Если реализация URLViewController представляет какой-либо интерес, вот она:

@implementation URLViewController
@synthesize webview;
@synthesize url;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (IBAction) done:(id) sender
{
    [self dismissModalViewControllerAnimated:YES];   
}

- (IBAction) openInSafari:(id) sender
{
   [(CVore*)[CVore sharedApplication] openURL:url withOverride:NO];
}

- (void)dealloc
{
    [super dealloc];
}

- (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.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.webview.delegate = self;
     NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webview loadRequest:requestObj];
    [self.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)]]; 
     [self.navigationItem setLeftBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(openInSafari:)]]; 
    // Do any additional setup after loading the view from its nib.
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString* title = [webView stringByEvaluatingJavaScriptFromString: @"document.title"];
    self.title = title;
    //self.navigationItem.title = title;
}

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

@end

UPDATE: После отслеживания этого, я думаю, что моя ошибка здесь заключается в том, что мне нужно установить для делегата UIWebView значение nil до того, как [super dealloc] будет правильным? Как и когда я это сделал, он больше не падает

1 Ответ

0 голосов
/ 30 мая 2011

Вы выпустили свой экземпляр URLViewController в ближайшее время или не сохранили его. Также проверьте, где вы использовали = вместо использования синтезированного сеттера (потенциально создающего зомби), если таковой имеется. Трудно быть полезным без какого-либо кода для просмотра.

__

Когда URLViewController был освобожден и освобожден, ваш webview действительно должен быть слишком к тому времени, когда вы вызываете super, потому что это член класса. Однако объекты не должны сохранять своих делегатов (чтобы не допустить «цикла сохранения»), поэтому, если вы каким-то образом добавляете дополнительное сохранение в свое веб-представление, здесь или где-либо еще, его делегат все равно может оказаться равным нулю и привести к сбою. , Например, у вас есть retain синтезатор для webview? И ты это когда-нибудь называл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...