gpt4 book ai didi

ios - UIWebView - CFData 何时(或如何)发布?

转载 作者:技术小花猫 更新时间:2023-10-29 10:17:49 24 4
gpt4 key购买 nike

在连续几天用头撞墙和失眠之后,我希望能在这里找到一些帮助。我浏览了这里的各种帖子,但似乎没有一个答案能为我提供解决方案。

简而言之,我的问题是我的应用程序在大量使用 UIWebView(>10 分钟)后崩溃(例如,依次打开较大的新闻报纸网站 - 一个接一个)。

要提供更多详细信息:我正在编写一个 iPhone 应用程序,我从 MainViewController 将 browserViewController 推送到 navigationController 上。 browserViewController 加载一个包含 UWebView 的 nib(我没有以编程方式创建 WebView)。使用 Interface Builder 连接 UIWebView。

当回到 Main 并再次进入 browserViewController 时,我只在它为 nil 时才重新创建 browserViewController。 (我想保留在 UIWebView 中加载的内容 - 只有在出现内存警告时才应卸载此 View 并释放所有使用的内存)。

在 MainViewController 和 browserViewController 中,我都在响应内存警告,但这似乎并没有提供足够的缓解。

查看 Instruments 我注意到,例如 CFData(store) 不断增加。即使我模拟内存警告(见下面的代码)并在 browserViewController 上调用 viewDidUnload,CFData 仍保持分配状态并且不会被释放。

所以我最大的问题是:
如何释放“浏览”产生的内存?

这有两种情况:
- 我如何确保 viewDidUnload 正确释放分配给我的 CFData(存储)的内存?
- 当用户在 browserViewController 中不断加载页面时,如何释放内存?
.
谁管理 CFData?

请参阅下面的简化示例代码:

主视图 Controller .h

//  MainViewController.h
#import "myAppDelegate.h"
#import "BrowserViewController.h"

@interface MainViewController : UIViewController {
BrowserViewController *browViewController;
}

- (void) switchToBrowserViewController;

@end

主视图 Controller .m

//  MainViewController.m
#import "MainViewController.h"

@implementation MainViewController

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

[browViewController release];
browViewController = nil;
}

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

- (void)dealloc {
[browViewController release];
browViewController = nil;
[super dealloc];
}

- (void) switchToBrowserViewController {

// create new browViewController if needed
if ( browViewController == nil ) {
browViewController = [[BrowserViewController alloc] initWithNibName:@"BrowserViewController" bundle:nil];
}

browViewController.navigationItem.hidesBackButton = YES;

[((myAppDelegate *)[UIApplication sharedApplication].delegate).navController setNavigationBarHidden:YES animated:NO];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: 1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:
((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController.view cache:YES];

[((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController pushViewController:browViewController animated:NO];
[UIView commitAnimations];

}

@end

浏览器 View Controller .h

//  BrowserViewController.h

#import <UIKit/UIKit.h>
#import "myAppDelegate.h"

@interface BrowserViewController : UIViewController <UIWebViewDelegate> {
IBOutlet UITextField *browserURLField;
IBOutlet UIWebView *browserWebView;
}

@property (nonatomic, retain) UIWebView *browserWebView;

- (void) loadURLinBrowser;

@end

浏览器 View Controller .m

//  BrowserViewController.m
#import "BrowserViewController.h"

@implementation BrowserViewController
@synthesize browserWebView;

- (void)viewDidLoad {
[browserWebView setDelegate:self];
[super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
[super viewDidUnload];

[browserWebView stopLoading];
[browserWebView setDelegate:nil];
[browserWebView removeFromSuperview];
[browserWebView release];
browserWebView = nil;

browserURLField = nil;
}

- (void)dealloc {
[browserURLField release];

browserWebView.delegate = nil;
[browserWebView stopLoading];
browserWebView = nil;
[browserWebView release];

[super dealloc];
}

- (void) switchBackToMainViewController {

[((myAppDelegate *)[UIApplication sharedApplication].delegate).navController setNavigationBarHidden:NO animated:NO];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: 1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController.view cache:YES];

[((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController popViewControllerAnimated:NO];

[UIView commitAnimations];
}

- (void) loadURLinBrowser {
NSURL *url = [[NSURL alloc] initWithString:browserURLField.text];
NSMutableURLRequest *request = [[NSURLRequest alloc] initWithURL: url];
[browserWebView loadRequest: request];
[request release];
[url release];
}

@end

我尝试了其他帖子的各种建议。例如:

  • 1) 将一个空页面加载到 WebView 中。

        NSString *html = @"<html><head></head><body></body></html>";
    [browserWebView loadHTMLString:html baseURL:nil];
  • 2) 在上面代码的不同地方使用 removeAllCachedResponses

        [[NSURLCache sharedURLCache] removeAllCachedResponses];
  • 3) setSharedURLCache 也没有提供缓解(我也在 AppDelegate applicationDidFinishLaunching 中使用了它)。

        NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    [sharedCache release];

不幸的是,这些都没有帮助“清除缓存”或释放由 CFData(store) 分配的内存。

如果有人能对此有所启发,让我知道我遗漏了什么或做错了什么,我将不胜感激。

.
.

编辑:
在 KiwiBastard 的初始回复后,我添加了一个屏幕截图,显示了我在 Instruments 中观察到的内容:

enter image description here

.
.

2010 年 6 月编辑:
我仍然无法解决这个问题。
在第二次尝试中,我完全以编程方式创建了 UIWebView。
还是一样的问题。但是我注意到一个奇怪的行为。例如,如果我将 PDF 文档加载到 webView 中并且我没有向上或向下滚动 PDF 页面,webView 和数据就会成功发布。但是,一旦我滚动到第二页,dealloc 将不再工作,我的应用程序最终会在某个时候耗尽内存。这太奇怪了,我无法解决这个问题。
有人知道吗?帮助?

最佳答案

要释放 CFData,您只需调用CFRelease(您的 CFData 对象名称)

关于ios - UIWebView - CFData 何时(或如何)发布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com