如何解决malloc_error_break?

我在使用iOS 3.0模拟器时遇到此错误,但在3.1.3和3.2模拟器上却没有。

malloc_error_break上创建一个符号断点malloc_error_break ,我在日志中看到了这个:

 [Session started at 2010-02-13 19:15:22 +0700.] 2010-02-13 19:15:24.405 iPortals[21656:207] bool for 1 iPortals(21656,0xa0089500) malloc: *** error for object 0x285e000: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug iPortals(21656,0xa0089500) malloc: *** error for object 0x2850000: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug iPortals(21656,0xa0089500) malloc: *** error for object 0x286c000: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug iPortals(21656,0xa0089500) malloc: *** error for object 0x287c000: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug 

这是我的代码

 @implementation WebViewController @synthesize myWebView; @synthesize AppDelegate; @synthesize mybanner; @synthesize request; - (void)dealloc { //NSLog(@"WebViewController has been dealloc"); myWebView.delegate = nil; self.myWebView = nil; [self.myWebView release]; [super setView:nil]; [myWebView release]; myWebView = nil; request = nil; [mybanner release]; [super dealloc]; } - (void)setView:(UIView *)aView { //NSLog(@"setView:(UIView *)aView"); if (aView == nil) { self.myWebView = nil; } [super setView:aView]; } - (void)action { AppDelegate = nil; AppDelegate = [[UIApplication sharedApplication] delegate]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:AppDelegate.PushLink]]; } - (void)didReceiveMemoryWarning { //NSLog(@"didReceiveMemoryWarning: view = %@, superview = %@", [self valueForKey:@"_view"], [[self valueForKey:@"_view"] superview]); [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview // Release anything that's not essential, such as cached data [[NSURLCache sharedURLCache] removeAllCachedResponses]; } - (void)viewDidLoad { [super viewDidLoad]; //NSLog(@"viewDidLoad: view = %@", self.view); self.title = NSLocalizedString(@"iPortals", @""); //UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithTitle:@"Item" style:UIBarButtonItemStyleBordered target:self action:@selector(action]; //self.navigationController.toolbar setItems: = [[UIBarButtonItem alloc] initWithTitle:@"[...]" style:UIBarButtonItemStyleBordered target:self action:@selector(action)]; /* UIBarButtonItem *emailButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(action)]; self.toolbarItems = [NSArray arrayWithObjects:emailButton, nil]; [emailButton release]; //*/ AppDelegate = nil; AppDelegate = [[UIApplication sharedApplication] delegate]; //NSLog(@"777777777 %@",AppDelegate.PushLink); /* CGRect webFrame = [[UIScreen mainScreen] applicationFrame]; webFrame.origin.y += kTopMargin + 5.0; // leave from the URL input field and its label webFrame.size.height = 400; //webFrame.size.height -= 40.0; self.myWebView = nil; //*/ //self.myWebView = [[[UIWebView alloc] initWithFrame:webFrame] autorelease]; self.myWebView.backgroundColor = [UIColor grayColor]; self.myWebView.scalesPageToFit = YES; self.myWebView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); self.myWebView.delegate = self; [self.view addSubview: self.myWebView]; self.mybanner.backgroundColor = [UIColor clearColor]; [self.view addSubview: self.mybanner]; /* CGRect textFieldFrame = CGRectMake(kLeftMargin, kTweenMargin, self.view.bounds.size.width - (kLeftMargin * 2.0), kTextFieldHeight); UITextField *urlField = [[UITextField alloc] initWithFrame:textFieldFrame]; urlField.borderStyle = UITextBorderStyleBezel; urlField.textColor = [UIColor blackColor]; urlField.delegate = self; urlField.placeholder = @""; urlField.text = AppDelegate.PushLink; urlField.backgroundColor = [UIColor whiteColor]; urlField.autoresizingMask = UIViewAutoresizingFlexibleWidth; urlField.returnKeyType = UIReturnKeyGo; urlField.keyboardType = UIKeyboardTypeURL; // this makes the keyboard more friendly for typing URLs urlField.autocapitalizationType = UITextAutocapitalizationTypeNone; // don't capitalize urlField.autocorrectionType = UITextAutocorrectionTypeNo; // we don't like autocompletion while typing urlField.clearButtonMode = UITextFieldViewModeAlways; [urlField setAccessibilityLabel:NSLocalizedString(@"URLTextField", @"")]; [self.view addSubview:urlField]; [urlField release]; */ request = nil; request = [NSURLRequest requestWithURL:[NSURL URLWithString:AppDelegate.PushLink] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [self.myWebView loadRequest:request]; } // called after the view controller's view is released and set to nil. // For example, a memory warning which causes the view to be purged. Not invoked as a result of -dealloc. // So release any properties that are loaded in viewDidLoad or can be recreated lazily. // - (void)viewDidUnload { [super viewDidUnload]; // release and set to nil [self.myWebView release]; self.myWebView = nil; } -(BOOL)canBecomeFirstResponder { //NSLog(@"canBecomeFirstResponder "); return YES; } -(void)viewDidAppear:(BOOL)animated { //NSLog(@"viewDidAppear "); [self becomeFirstResponder]; } - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { //NSLog(@"overrideoverrideoverrideoverrideoverrideoverrideoverrideoverride "); if ( event.subtype == UIEventSubtypeMotionShake ) { // Put in code here to handle shake AppDelegate = nil; AppDelegate = [[UIApplication sharedApplication] delegate]; [AppDelegate ToggleNavigationBar]; [AppDelegate playsound:1]; [self setAdHide:AppDelegate.toggle]; } } - (void)setAdHide:(BOOL)hide { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.6]; if (!hide) { if (current == UIInterfaceOrientationLandscapeLeft || current == UIInterfaceOrientationLandscapeRight) { [mybanner setFrame:CGRectMake(0, 272, mybanner.frame.size.width, mybanner.frame.size.height)]; } else { [mybanner setFrame:CGRectMake(0, 432, mybanner.frame.size.width, mybanner.frame.size.height)]; } } else { [self restoreAd]; } [UIView commitAnimations]; } - (void)restoreAd { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.6]; [mybanner setFrame:CGRectMake(0, 0, mybanner.frame.size.width, mybanner.frame.size.height)]; [UIView commitAnimations]; } #pragma mark - #pragma mark UIViewController delegate methods - (void)viewWillAppear:(BOOL)animated { self.myWebView.delegate = nil; self.myWebView.delegate = self; // setup the delegate as the web view is shown } - (void)viewWillDisappear:(BOOL)animated { //[self.myWebView removeFromSuperview]; [self.myWebView stopLoading]; // in case the web view is still loading its content self.myWebView.delegate = nil; // disconnect the delegate as the webview is hidden [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { current = interfaceOrientation; [self restoreAd]; return ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIDeviceOrientationPortrait) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight)); } // this helps dismiss the keyboard when the "Done" button is clicked - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; [self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[textField text]]]]; return YES; } #pragma mark - #pragma mark UIWebViewDelegate - (void)webViewDidStartLoad:(UIWebView *)webView { // starting the load, show the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } - (void)webViewDidFinishLoad:(UIWebView *)webView { // finished loading, hide the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { // load error, hide the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // report the error inside the webview //NSString* errorString = [NSString stringWithFormat: // @"An error occurred:
%@
", // error.localizedDescription]; //[self.myWebView loadHTMLString:errorString baseURL:nil]; //URLCacheAlertWithError(error); } @end

按照日志消息中的建议:在malloc_error_break设置断点。 当断点触发时,查看Xcode中的回溯(或使用gdb命令行上的bt命令),看看你在哪里调用free ,或者使用free API。

使用Xcode静态分析器有时可以发现内存使用问题 – 从Xcode构建菜单中选择“构建和分析”。

你似乎一再试图解除你的指针 。 在dealloc方法中只调用[blah release]; 并在viewDidUnload方法中为指针指定一个nil值。 两种方法都不要同时做。

 - (void)dealloc { [self.myWebView release]; [mybanner release]; [super dealloc]; } - (void)viewDidUnload { [super viewDidUnload]; self.myWebView = nil; } 

你似乎也缺少一些变量。

这似乎完全不相关,但有类似的错误,对我有用的是修复磁盘权限。

  • 打开磁盘工具应用程序 – >修复磁盘权限
  • 重启电脑

我从Mac终端得到了这个建议- 打开终端时“指针被释放没有分配”错误

此外,我意识到这个问题已经有6年了,因此它不太可能对原始提问者有用。 我希望这个答案有助于其他有类似错误的人。

令人惊讶的是,为我解决的是关闭并重新打开调试设备。 哦,Apple ……