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分析泄漏仪器的问题的主要内容,如果未能解决你的问题,请参考以下文章

重新仪器“内存泄漏”分析,其他工具是不是提供更多信息以找到泄漏的根本原因?

IPHONE:使用仪器分析泄漏

分析仪结果与仪器泄漏:iPhone 内存泄漏

仪器(泄漏/活动监视器/时间分析器等)无法启动 - 发生了啥?

每次滑动到下一页时,内存都会增加很多。仪器泄漏报告和静态分析仪都可以

Xcode 6 内存泄漏仪器不起作用