iPhone SDK:我应该如何/何时发布UITableView委托对象?

时间:2009-11-08 17:17:54

标签: iphone uitableview autorelease

我使用自定义类作为UITableView上的委托和数据源。我在viewDidLoad方法中做了(类似的事情):

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

当然我需要减少myObject上的保留计数吗?但是在这里调用[myObject release]会产生非常糟糕的结果 - 委托在表完成之前就被销毁了。

我试过了

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

但也会产生可怕的后果。

我这里有内存泄漏吗?如果是这样,我如何以及何时安全地释放代表?

2 个答案:

答案 0 :(得分:2)

通过在myObject@interface文件)中声明实例变量来.h,然后调用...

[myObject release];

..在您的dealloc方法中。

答案 1 :(得分: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