私は本当にこれに困惑しています。私は正しい方法でメモリを管理していると信じていますが、コードを実行すると、オブジェクトを二重に解放していることが示唆されます。ここにコードを書いて、何が起こっているのかを説明します。二重放出が起こらないようにするとき
@protocol SomeDelegate <NSObject>
@required
- (id)initWithCols:(NSUInteger)Cols Rows:(NSUInteger)Rows;
@end
@interface SomeObject : NSObject <SomeDelegate> {
}
- (id)initWithCols:(NSUInteger)Cols Rows:(NSUInteger)Rows;
@end
@interface Layout : UIView {
id<SomeDelegate> someDelegate;
}
@property(retain) id<SomeDelegate> someDelegate;
- (id)initWithFrame:(CGRect)aRect Cols:(NSUInteger)Cols Rows:(NSUInteger)Rows;
@end
@implementation Layout
@synthesize someDelegate;
- (id)initWithFrame:(CGRect)aRect Cols:(NSUInteger)Cols Rows:(NSUInteger)Rows {
if(self = [super initWithFrame:aRect]) {
cols = Cols;
rows = Rows;
id<SomeDelegate> delegate = [[SomeObject alloc] initWithCols:cols Rows:rows];
[self setSomeDelegate:delegate];
//[delegate release];
}
return self;
}
-(void)dealloc {
[someDelegate release];
[super dealloc];
}
@end
ここで、「// [委任リリース];」のコメントを外すと、レイアウトクラスのコンストラクタの行に "EXC_BAD_ACCESS"というエラーが発生し、アプリケーションがdeallocを試みるとクラッシュします。レイアウトクラスのdeallocメソッドでsomeDelegateオブジェクトのリリースにクラッシュしました。コメントを残しておけば、アプリケーションは正常に動作します。
誰かがObjective-Cのメモリ管理について読んだことのすべてに反しているように見える理由を説明できますか?
コード例は実際には動作しますが、私のコードは例に従わないことに注意してください。私の実際のSomeObjectの中に、自動解放を引き起こしているものがありますか?
ありがとうございます。
"デリゲート"変数の名前を変更するとどうなりますか?私はそれが問題ではないはずですが、私は同じ行に沿ってココア-deメーリングリストで何かを読んでいることを覚えています。特定の変数名で奇妙な振る舞いをする。 UIViewには独自のデリゲートがありますが、それに何か関係があるのだろうかと思います。 – dreamlax
良い考えですが、残念なことに私は代理人に名前を変更しようとしましたが、まだリリースの問題があります。 –
ちょっとメモしておきますが、コードスニペットが実際に機能するので、オートレットする原因となっているSomeObject(完全なコードでありスニペットではない)の中に何かがあると思っています。オブジェクトは、それを知らされることなく、自身を自動解放することができますか? –