开发者

Looking for pointers on how to debug a "message sent to deallocated instance"

I am getting the following error:

* -[URLViewController respondsToSelector:]: message sent to deallocated instance 0xdb5c3b0

and I am quite confused on how to start debugging this. Can someone please give me some pointers on where to start to look at?

Here's some code if you want to see. This is actually a URL interceptor, so that every links opens up in a 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;
}

If the URLViewController implementation is any interest, here it is:

@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: After tracking this, I think my mistake here is I need to set UIWebView deleg开发者_StackOverflowate to nil before the [super dealloc] is this correct? As when I did this, it no longer crashes


You've released your URLViewController instance to soon or you've not retained it. Also check for where you've used = instead of using the synthesized setter (potentially creating a zombie), if any. It's hard to be helpful without any code to look at.

__

When the URLViewController has been released and deallocated, your webview really should be too by the time you call to super because it's a class member. However, objects must not retain their delegates (to prevent a "retain-cycle") so if you're some how putting an extra retain on your webview, here or elsewhere, its delegate can still end up being nil and give the resulting crash. For example, do you have a retain synthesizer for webview? And have you called this at any time?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜