UIKit内存泄漏

时间:2010-09-04 13:55:24

标签: iphone memory-leaks

我刚刚在运行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(仪器报告的负责库),我不确定是否需要清除它们,或者它是否有所作为。泄漏是一个严重的问题吗?如果我必须修理它们,我该怎么做?我无法找到跟踪因为负责的库不是我的。

1 个答案:

答案 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