【问题标题】:UIKit Memory LeakUIKit 内存泄漏
【发布时间】:2010-09-04 13:55:24
【问题描述】:

我刚刚使用 Instrument 在运行 iOS 3.1.2 的 iPhone 3G 上检查我的应用程序中的内存泄漏。我发现 Instruments 中显示了几个泄漏。 Instruments 输出如下:

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(Instruments 报告的负责库),我不确定是否需要清除它们,或者它是否会有所作为。泄漏是一个严重的问题吗?如果我必须修复它们,我该怎么做?我找不到踪迹,因为负责的图书馆不是我的。

【问题讨论】:

  • 对不起,由于我无法上传屏幕截图,以上仪器输出为质量。我只是想解释一下泄漏对象来自 UIKit。我无法在我的应用中找到准确的代码行。
  • 你是否也开启了僵尸仪器?
  • @rano,我在参数中将“NSZombieEnabled”添加到 YES,但它似乎仍然相同。我还需要什么?谢谢。
  • 您不得启用 nszombie,因为解除分配的对象将被视为内存泄漏

标签: iphone memory-leaks


【解决方案1】:

你应该关心他们!我目前正在追踪此类泄漏。有几种可能,为什么会发生:

1) 在 Interface Builder 中设计 UIView 并在 UIViewController 中初始化此视图(用于动画和隐藏/显示问题):

您可能已经定义了一些 IBOutlets(在您的 .h 文件中),您可能已经在 Interface Builder 中将它们连接到了文件的所有者。这个 IBOutlets 应该(据我所知)始终被设计为一个属性(如果我错了,请随时纠正我)并且在 dealloc 方法中,不要忘记“nil”它。

例如: 在 viewcontroller 头文件中(我将其命名为 MyViewController.h)

@interface MyViewController : UIViewController {

IBOutlet UIWebView* webView;

}

@property(非原子,保留)IBOutlet UIWebView* webView;

@结束

在 viewController 的 .m 文件中:

@实现

@synthesize webView;

  • (无效)dealloc {

self.webView = nil; //永远不要忘记这一点,否则它会泄漏

[超级释放];

}

@结束

2) 在 Interface Builder 中设计一个 UIView 并将这个 View 子类化:

我的意思是子类化,您可以创建一个子类 UIView 类,并在 Interface Builder 中将类标识符设置为例如 MyView

例如:

@interface MyView : UIView {

IBOutlet UIWebView* webView;

}

@property(非原子,保留)IBOutlet UIWebView* webView;

@结束

与 1 相同)(IBOutlets 应该在解除分配时设置为零)

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]; //只删除一个SubView

for (UIView *subview in [self.view subwiws]) { //或删除任何子视图

[子视图 removeFromSuperview];

}

}

希望对你有帮助!

Br 网卡

【讨论】:

  • 这棵树的东西真的应该牢记在心!他们真的会帮助你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
  • 2013-06-24
  • 2011-03-22
  • 2015-04-20
相关资源
最近更新 更多