2

我有一个 webview 我想在某些情况下创建一个新实例。

我这样做:

if(self.webViewController){
    self.webViewController = nil;
    [self.webViewController release];
}

self.webViewController = [[WebViewController alloc]initWithNibName:@"TheWebView" bundle:nil];

self.webViewController我听NSNotification

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

  }
NSLog(@"INITING WebView");
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doPageRequest:) name:@"doPageRequest" object:nil];
return self;
}

但是,如果我发送一条消息doPageRequest,它会被多次调用。所以我的假设是还有更多的 webView 实例“活动”,这意味着:当我创建新实例时,旧实例没有正确释放。

4

1 回答 1

2

你应该[[NSNotificationCenter defaultCenter] removeObserver:self];dealloc方法中调用

添加以下内容,并从您的 init 方法中删除 removeObserver 行。

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

重新创建视图控制器时发生的self变化,它是指向新视图控制器所在内存的新部分的指针。
因此,在 init 中调用[[NSNotificationCenter defaultCenter] removeObserver:self];永远不会删除您在 init 中添加的前一个。

此外,您self.webViewController = nil;在调用 release 之前设置了它,显然这不起作用(您在 nil 上调用 release),因此请切换顺序。

[self.webViewController release];
self.webViewController = nil;
于 2013-09-06T07:55:14.607 回答