ipad分析泄漏仪器的问题
Posted
技术标签:
【中文标题】ipad分析泄漏仪器的问题【英文标题】:Problem in analyzing Leak instrument in ipad 【发布时间】:2011-07-05 05:38:48 【问题描述】:我是第一次使用检漏仪。 我的代码中有两次泄漏,当我看到源代码时,它会显示在这两个粗体语句中......
- (id) initWithFrame: (CGRect) frame
[self LoadMoviePlayer];
**self= [super initWithFrame:frame];**
if (self==[super initWithFrame:frame])
CAEAGLLayer* eaglLayer = (CAEAGLLayer*) self.layer;
eaglLayer.opaque = YES;
- (void) applicationDidFinishLaunching: (UIApplication*) application
CGRect screenBounds = [[UIScreen mainScreen] bounds];
m_window = [[UIWindow alloc] initWithFrame: screenBounds];
**m_view = [[GLView alloc] initWithFrame: screenBounds];**
[m_window addSubview: m_view];
[m_window makeKeyAndVisible];
不知道下一步该怎么做才能解决问题。
【问题讨论】:
【参考方案1】:据我所知,第一次泄漏发生在您在未初始化的情况下在 init 中执行代码时(您的[super initWithFrame:]
发生在您的[self loadMoviePlayer]
之后),第二次,乍一看,似乎是 m_view 被分配,但未发布,您可以使用以下方法解决它:
CGRect screenBounds = [[UIScreen mainScreen] bounds];
m_window = [[UIWindow alloc] initWithFrame: screenBounds];
m_view = [[GLView alloc] initWithFrame: screenBounds];
[m_window addSubview: m_view];
[m_view release];
[m_window makeKeyAndVisible];
这应该可以工作,因为 m_view 已经被添加到窗口中(因此被保留)。
【讨论】:
我在 dealloc 函数中发布 m_view,我不知道为什么,但是当我评论“self= [super initWithFrame:frame];”时线那么问题就解决了。我已经检查了 self 值,并且在 self.loadmoviePlayer 被调用时它不为空,任何人都对我的问题有任何想法。 m_view的分配会将其retain count设为1,window的addSubView会将其设为2。你组件的dealloc会将其释放为1,但只要你不将其从窗口中移除或不释放窗口,其保留计数保持为 1。 另外.. loadMoviePlayer 行背后的想法是:准确地说,是在你在 if() 块中执行了 [super initWithFrame:] 之后。如果您在尚未完全初始化的对象中创建对象实例(这正是您在此处所做的),则行为主要定义为“您不想那样做”。您已经在 if() 块中设置了图层的属性,为什么不在 if() 块中加载该电影播放器呢?以上是关于ipad分析泄漏仪器的问题的主要内容,如果未能解决你的问题,请参考以下文章
重新仪器“内存泄漏”分析,其他工具是不是提供更多信息以找到泄漏的根本原因?
仪器(泄漏/活动监视器/时间分析器等)无法启动 - 发生了啥?