2012-02-09 12 views
1

私はスーパークラス 'Node'といくつかのサブクラスを持っています。 'SubNode1'、 'SubNode2'などサブクラス化が原因でメモリアクセスが不正になる、プロパティをどのように構造化するか

すべてのサブクラスで 'parentNode'と呼ばれるプロパティが必要です。 initが 'SubNode1'で呼び出され、オブジェクトが '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

。エラーはおそらくです:

super.parentNode = theParentNode; 

は次のようになります。

self.parentNode = theParentNode; 
0

initWithParentNodeががノードでを定義する必要があります。

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

とサブノードから呼び出さ

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

確かにより良いスタイルですが、元のバージョンではメモリの問題が発生する可能性があります。あまりにもARCに慣れて、明らかに:) –

関連する問題