2011-10-05 4 views
0

私はメモリ管理について少し質問があります...メモリ不良アクセス:リリース、プロトコル、デリゲートに関する質問

よく1つのプロトコルを持つ独自のビューを定義します。他のクラスでは、別のクラスのインスタンスを作成し、別のビューにビューを追加してインスタンスを解放しようとします。この問題は、BAD_ACCSエラーが発生したためにプロトコルのメソッドを呼び出すと表示されます。

- (void)viewDidLoad{ 
    Class1 *c1 = [[Class1 alloc]init]; 
    [c1 setDelegate:self]; 
    [self.view addSubview:c1.view]; 
    [c1 release]; 
} 

- (void)methodOfProtocolClass1 { 
    NSLog(@"c1 method called") 
} 

Class1のは一つのボタンを持っていると私はそれを押したときに、私はmethodOfProtoclClass1に呼び出すとエラーになります:それはこのようなものです。誰もこのオブジェクトをリリースする方法を知っていますか?

おかげで、あなたがここにC1をoverreleasingているデビッド

答えて

0

c1を解放する必要はありませんが、保持する必要があります。 addSubviewはc1インスタンスを保持せず、ビューのみを保持します。後でc1を参照すると、不正なアクセスが発生します

+0

はい、私は知っていますが、あなたが1つのUIButtonで同じものを作ればうまくいきます。ボタンをひとつ割り当ててから、ビューに追加してから解放することができます。なぜ自分のビューではないのですか? :S(回答ありがとうございます!) – damacri86

+0

オブジェクト全体(c1)を渡すのではなく、その「作品」(c1.view) – daveoncode

+0

あなたは正しいです!ありがとう:) – damacri86

1

...

- (void)viewDidLoad{ 
    Class1 *c1 = [[Class1 alloc]init]; //allocates Class1 instance with +1 ref count 

    [c1 setDelegate:self]; 
    [self.view addSubview:c1.view]; 
    [c1 release]; //releases c1, ref count goes to 0 and the memory is reclaimed later 
} 

は、したがって、あなたが悪いのアクセスを取得

、C1のおインスタンスがあなたの最後で行って、有効なされていませんviewDidLoadメソッド

+0

答えをありがとう。そして私は前の答えと同じことを言います。あなたがUIButtonでそれを行うことができるなら、なぜ自分のクラスではないのですか? – damacri86

+0

UIViewであるボタンを操作すると、c1ではなくc1ビューが追加されます。次に、そのビューを保持するClass1sビューを追加します。これは、Class1 Instnaceではなく、ビュープロパティを保持します – Daniel

+0

Thats true 、お返事ありがとうございます:) – damacri86