WebView被释放了太多次

时间:2014-02-28 14:21:38

标签: objective-c macos webkit foundation

我正在尝试在WebView中加载网页,以便拍摄网站的快照。 WebView包含在我为此目的创建的临时窗口中。但是,在我发布WebView和临时窗口后不久,WebView就会发送另一条释放消息,而它已经被释放。这是调试器中的错误消息,NSZombieEnabled设置为YES。

*** -[WebView release]: message sent to deallocated instance 0x608000125820

我无法弄清楚导致WebView被释放的次数是多少。令它更加混乱的是,只有在加载某些URL时才会出现问题。例如:当尝试拍摄http://www.google.com的快照时,一切都很好,但在使用http://edition.cnn.com时,它几乎总是崩溃。

这是代码的简化版本:

@interface AppDelegate ()

@property (nonatomic, strong) NSWindow *tempWindow;
@property (nonatomic, strong) WebView *webView;

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    CGRect frame = CGRectMake(0, 0, 1200, 695);
    self.tempWindow = [[NSWindow alloc] initWithContentRect:frame styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
    self.webView = [[WebView alloc] initWithFrame:frame];
    self.webView.frameLoadDelegate = self;

    self.tempWindow.contentView = self.webView;

    [[self.webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://edition.cnn.com"]]];
}

#pragma mark - WebFrameLoadDelegate

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
    if (frame != [sender mainFrame]) {
        return;
    }

    // take snapshot here...
    [self takeSnapshot];

    // get rid of web view and temp window
    [self.webView stopLoading:nil];
    [self.webView setFrameLoadDelegate:nil];

    self.webView = nil;
    self.tempWindow = nil;
}

1 个答案:

答案 0 :(得分:2)

使用ARC时,在某些情况下保留/释放WebView似乎有问题。在我的测试中,我发现在释放它之前在NSString的{​​{1}}中加载空mainFrame应该可以解决问题。

另请参阅short blog entry on this topic