1

UITableView のデリゲートおよびデータソースとしてカスタム クラスを使用しています。私は私のviewDidLoadメソッドでこれを(何かのように)やっています:

MyClass *myObject = [[MyClass alloc] init];
tableViewOutlet.delegate = myObject;
tableViewOutlet.dataSource = myObject;

確かに、どこかで myObject の保持カウントを減らす必要がありますか? しかし、ここで [myObject release] を呼び出すと、非常に悪い結果になります。テーブルが処理を完了する前に、デリゲートが破棄されます。

私が試してみました

MyClass *myObject = [[[MyClass alloc] init] autorelease];

しかし、それはまた恐ろしい結果をもたらします。

ここでメモリリークがありますか?もしそうなら、デリゲートを安全に解放する方法と時期は?

4

2 に答える 2

2

インターフェイス ファイル:

@interface SomeClass: NSObject {
    MyClass *myObject;
}
@property (nonatomic,retain) MyClass *myObject;

@end

実装ファイル:

@implementation SomeClass
@synthesize myObject;

-(void)dealloc {
    // if you want to be safe, change tableViewOutlet properties...
    // tableViewOutlet.delegate = nil;
    // tableViewOutlet.dataSource = nil;
    [myObject release]; // retain = 0
    [super dealloc];
}
...
MyClass *obj = [[MyClass alloc] init]; // retain = 1
self.myObject = obj; // retain  = 2

// NOTE: if you instead write: myObject = obj; **NO** retain msg will be sent.
// *not* what you want in this context.
tableViewOutlet.delegate = obj; // assign, so retain =2 
tableViewOutlet.dataSource = obj;  // assign, so retain = 2
[obj release]; // retain = 1
...

@end
于 2009-11-08T17:46:26.670 に答える
2

(ファイル)でmyObject宣言してインスタンス変数を作成し、次に呼び出します...@interface.h

[myObject release];

..あなたのdealloc方法で。

于 2009-11-08T17:30:58.230 に答える