子类化导致内存访问不良,应该如何构造属性

时间:2012-02-09 16:31:32

标签: iphone objective-c

我有一个超类'Node'和几个子类,例如'SubNode1','SubNode2'等。

我需要一个所有子类都需要称为'parentNode'的属性。当在'SubNode1'上调用init并且对象通过类型'Node'传递时,它被设置。我使用子类的原因是因为这些对象符合协议,每次都不能使用子类 - 我需要传递'Node'。

我不知道的是如何构建我的对象。应该在哪里释放,属性应该保留在哪里,并且应该保留,因为我经常因为这个而导致exe_bad_access错误。

这就是我目前的结构:

Node.h

 @property (nonatomic, retain) Node *parentNode;

Node.m

- (void)dealloc {
    [parentNode release];
    [super dealloc];
}

SubNode1.h

@interface SubNode1 : Node
{
    // No reference to parentNode property
}

SubNode1.m

- (id)initWithParentNode:(SubNode1 *)theParentNode {
    self = [super init];
    if (self) 
    {
        super.parentNode = theParentNode;
    }

    return self;
}

- (void)dealloc {
    [super dealloc];
}

2 个答案:

答案 0 :(得分:2)

你已经以正确的方式设计它了。错误可能是:

super.parentNode = theParentNode;

应该是:

self.parentNode = theParentNode;

答案 1 :(得分:0)

initWithParentNode应该在Node:

定义
- (id) initWithParentNode: (Node *) parentNode_ {
    if ((self = [super init])) {
        self.parentNode = parentNode_ ;
        ...
    }
}

SubNode调用:

- (id) initWithParentNode: (Node *) parentNode_ {
    if ((self = [super initWithParentNode: parentNode_])) {
        ...
    }
}