我刚刚在运行iOS 3.1.2的iPhone 3G上使用Instrument来检查我应用中的内存泄漏。我发现仪器中有几处泄漏。仪器输出如下:
Leaked Object # Address Size Responsible Library Responsible Frame
GeneralBlock-16 2 < multiple > 32 UIKit -[UIViewAnimationState animationDidStart:]
GeneralBlock-16 2 < multiple > 32 UIKit -[UIViewAnimationState animationDidStart:]
GeneralBlock-16 0x163be0 16 UIKit -[UITransitionView _didStartTransition]
GeneralBlock-16 0x160730 16 UIKit -[UITableView(UITableViewInternal) _sectionHeaderViewWithFrame:forSectionpaque:reus eViewIfPossible:]
GeneralBlock-16 0x157060 16 UIKit -[UIScrollView(Static) _startTimer:]
GeneralBlock-16 0x148480 16 UIKit -[UIScrollView _endPanWithEvent:]
GeneralBlock-16 0x13d570 16 UIKit -[UINavigationBar pushNavigationItem:]
GeneralBlock-16 0x13c8b0 16 UIKit -[UIScrollView _updatePanWithStartDelta:event:gesture:ignoringDir ectionalScroll:]
GeneralBlock-16 0x132240 16 UIKit -[UINavigationTransitionView transition:fromView:toView:]
GeneralBlock-16 0x126ec0 16 UIKit -[UINavigationBar popNavigationItem]
GeneralBlock-16 0x11ad50 16 UIKit -[UITableViewCell _saveOpaqueViewState:]
因为大多数泄露的物品来自UIKit(仪器报告的负责库),我不确定是否需要清除它们,或者它是否有所作为。泄漏是一个严重的问题吗?如果我必须修理它们,我该怎么做?我无法找到跟踪因为负责的库不是我的。
答案 0 :(得分:1)
你应该关心他们!我目前正在追查这些泄漏事件。有几种可能性,为什么会出现这些可能性:
1)在Interface Builder中设计UIView并在UIViewController中初始化此视图(用于动画和隐藏/显示问题):
您可能已经定义了一些IBOutlets(在您的.h文件中),您可能已在Interface Builder中将其连接到文件所有者。这个IBOutlets应该(据我所知)总是被设计为一个属性(请随意纠正我,如果我错了)并且在dealloc方法中,不要忘记“nil”它。
e.g: 在viewcontroller头文件(我将其命名为MyViewController.h)
@interface MyViewController:UIViewController {
IBOutlet UIWebView * webView;
}
@property(nonatomic,retain)IBOutlet UIWebView * webView;
@end
在viewController的.m文件中:
@implementation
@synthesize webView;
- (void)dealloc {
self.webView = nil; //永远不会忘记这一点,否则它会泄漏
[super dealloc];
}
@end
2)在Interface Builder中设计UIView并将此视图子类化:
使用子类化我的意思是,您可以创建一个子类UIView类,并在Interface Builder中将类标识符设置为例如MyView
例如:
@interface MyView:UIView {
IBOutlet UIWebView * webView;
}
@property(nonatomic,retain)IBOutlet UIWebView * webView;
@end
与1相同)(IBOutlets在取消分配时应设置为nil)
3)添加UIView作为子视图:
永远不要忘记删除此视图。
例如:(在我的MyViewController中,我想添加一个子视图)
- (void)viewDidLoad {
UIView * aSubView = [[UIView alloc] initWithFrame:CGRectMake(0,0,90,90)];
aSubView.tag = 123;
aSubView.backgroundColor = [UIColor blueColor];
[self.view addSubView:aSubView];
[aSubView发布];
}
和
- (void)viewDidUnload {
[[self.view viewWithTag:123] removeFromSuperview]; //仅删除aSubView
for([self.view subwiews]中的UIView *子视图){//或删除任何子视图
[subview removeFromSuperview];
}
}
希望它有所帮助!
Br Nic