【问题标题】:Dealloc not called in superclass超类中未调用 Dealloc
【发布时间】:2012-03-18 22:56:44
【问题描述】:

我看到一些我不理解的奇怪行为。 我有一个助手类 HelperClass,它被分配并保留在一个超类 SuperClass 中。

在超类的dealloc函数中,我释放了HelperClass。这一切都很好。但是当我子类化时,HelperClass 被释放,但由于某种原因没有调用 HelperClass 上的 dealloc。当我在子类中释放 HelperClass 时,它确实有效。

有什么想法吗?

(编辑:如果我明确调用 [HelperClass dealloc] 而不是 [HelperClass release] 似乎可以正常工作,但这是一种正确的方法吗?)

@interface SuperClass : UIViewController {

    @protected
    PlayerHelper* _mediaPlayerHelper;    
}

@end

发起于:

- (void)viewDidLoad
{
    [super viewDidLoad];            
    // Add observer/helper for audio events
    _mediaPlayerHelper = [[[PlayerHelper alloc] init:self] retain];
}

使用dealloc:

- (void) dealloc {
    if(_mediaPlayerHelper != nil) {
        [_mediaPlayerHelper release];
    }

    [super dealloc];
}

如果我像这样子类化:

@interface SubClass : SuperClass

释放这个类,HelperClass 没有得到正确的释放。如果我在子类中专门发布帮助程序,它确实有效。 释放子类时调用的是超类的dealloc,而不是helper中的dealloc。

helper 是一个简单的 NSObject 类:

@interface PlayerHelper : NSObject

【问题讨论】:

  • SuperClass 的超类是什么?能发下相关代码吗?
  • 向我们展示一些分配/解除分配 HelperClass 的代码,以及未解除分配 HelperClass 的具体示例。不要不要手动拨打dealloc

标签: objective-c


【解决方案1】:

你在这里双重保留

[[[PlayerHelper alloc] init:self] retain];

改为使用:

[[PlayerHelper alloc] init:self];

http://interfacelab.com/objective-c-memory-management-for-lazy-people/

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2013-04-28
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多