- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
在连续几天用头撞墙和失眠之后,我希望能在这里找到一些帮助。我浏览了这里的各种帖子,但似乎没有一个答案能为我提供解决方案。
简而言之,我的问题是我的应用程序在大量使用 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?
请参阅下面的简化示例代码:
// MainViewController.h
#import "myAppDelegate.h"
#import "BrowserViewController.h"
@interface MainViewController : UIViewController {
BrowserViewController *browViewController;
}
- (void) switchToBrowserViewController;
@end
// 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
// 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
// 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 中观察到的内容:
.
.
2010 年 6 月编辑:
我仍然无法解决这个问题。
在第二次尝试中,我完全以编程方式创建了 UIWebView。
还是一样的问题。但是我注意到一个奇怪的行为。例如,如果我将 PDF 文档加载到 webView 中并且我没有向上或向下滚动 PDF 页面,webView 和数据就会成功发布。但是,一旦我滚动到第二页,dealloc 将不再工作,我的应用程序最终会在某个时候耗尽内存。这太奇怪了,我无法解决这个问题。
有人知道吗?帮助?
最佳答案
要释放 CFData,您只需调用CFRelease(您的 CFData 对象名称)。
关于ios - UIWebView - CFData 何时(或如何)发布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982955/
我有一个CFMutableDictionaryRef ,调试器中的部分内容是: "device-id" = ; model = ; "vendor-id" = ; 现在我可以获得 key model
我在使用 AFNetworking 时遇到问题。我使用以下方法通过 GET 从我的服务器请求大量 JSON 数据: [[SessionResponseClient sharedClient] getP
我想在 Swift 中创建一些 PDF 页面。 这是我创建 PDF 页面的代码 // Initialize context and other stuff CGPDFContextBeginPage(
在应用程序启动时,我的 Cocoa 应用程序立即创建两个 CFData 对象。一个大小为 34 MB,另一个大小为 57 MB。我似乎无法弄清楚这些对象是什么或者它们来自 Instruments 中的
我有以下代码来阅读PDF页面。 问题是每次我阅读仪器分析的页面时,CFData (store) 都会增加大约 1MB?任何帮助表示赞赏。 CGColorSpaceRef colorSpace = CG
我需要将我的 Objective-C 转换为 Swift,以便从地址簿中获取联系人的图像。但是我从 CFData 到 NSData 的转换中遇到错误,我不知道如何让它工作。我该怎么做才能使这项工作正常
我只能在特定应用程序中使用 CoreFoundation,并且无权访问 NSData。 我需要使用内存映射访问文件中的数据,因为文件可能非常大。使用 NSData,我可以使用 +dataWithCon
我需要从 C 调用一些 Swift 代码,它接受一个输入字节数组并生成一个输出字节数组。 这是在桥接头中: typedef void (*SwiftFunc)(const uint8_t* input
在连续几天用头撞墙和失眠之后,我希望能在这里找到一些帮助。我浏览了这里的各种帖子,但似乎没有一个答案能为我提供解决方案。 简而言之,我的问题是我的应用程序在大量使用 UIWebView(>10 分钟)
我遇到分配内存过多的问题。我的应用程序分配内存达到 100MB!是的...我正在使用ARC。大部分内存分配是由 CFData 分配的(据我所知,它是 CoreImage 过滤器)。对图像应用滤镜后,C
用户第一次打开我的应用程序时,我需要下载大量数据。我以 JSON 格式从服务器获取所有这些数据。根据用户的不同,这些 JSON 文件的大小可能在 10kb 到 30mb 之间,并且有 10 多个。 当
根据 GDPR 要求,我使用 Apple 内置的“安全”模块来帮助加密和解密信息。我能够使用文档相当轻松地生成我的私钥和公钥。 我现在发现自己的问题是在尝试进行加密时。在我关注的 Apple 文档中(
我有一个 function返回一个 std::string 对象。我正在使用 Cocoa/CoreGraphics,我需要一种方法将该字符串中的数据放入 CFData object这样我就可以将 th
此代码应该从 CGImageRef 开始获取每个像素的值: UIImage* image = [UIImage imageNamed:@"mask.bmp"]; CGImageRef aCGImage
我正在使用 Swift 与核心 MIDI API 进行交互,但在使用 MIDIThruConnectionFind 函数时遇到了一些问题。 documentation陈述如下 func MIDIThr
我有一个不使用 ARC 的库。 简化的代码如下所示: // // test.m // test-cast // #import static CFDataRef CFDataCreateFrom
我正在尝试对首选项文件进行逆向工程(不是为了任何邪恶的目的,只是为了我可以编写它的使用脚本),其中存储了坐标数组。 这是属性列表中的重要片段: $class CF$UID
我需要你的帮助,此代码在 Swift 3 中不再编译 //: Let's set up the `sockaddr_in` C structure using the initializer. var
我在后台线程中使用 NSData -initWithContentsOfURL 下载一些 4k 图像。我可以在 Instruments 中看到我的 CFData(存储)不断增长并增加到 200MB(顺
我正在尝试访问此 answer 之后的内在矩阵. 通过运行下面的指令,我能够得到一个 48 字节的 AnyObject。 ,我进一步将其转换为 CFData . let camData = CMGet
我是一名优秀的程序员,十分优秀!