【问题标题】:Problem in analyzing Leak instrument in ipadipad分析泄漏仪器的问题
【发布时间】: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];
}

不知道下一步该怎么做才能解决问题。

【问题讨论】:

    标签: ipad memory-leaks xcode-instruments


    【解决方案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() 块中加载该电影播放器​​呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2011-06-23
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多