iPhone SDK:我应该如何/何时发布 UITableView 委托对象?
Posted
技术标签:
【中文标题】iPhone SDK:我应该如何/何时发布 UITableView 委托对象?【英文标题】:iPhone SDK: How/when should I release a UITableView delegate object? 【发布时间】:2009-11-08 17:17:53 【问题描述】:我在 UITableView 上使用自定义类作为委托和数据源。我正在我的 viewDidLoad 方法中做(类似的事情):
MyClass *myObject = [[MyClass alloc] init];
tableViewOutlet.delegate = myObject;
tableViewOutlet.dataSource = myObject;
我肯定需要在某处减少 myObject 的保留计数吗?但是在这里调用 [myObject release] 会产生非常糟糕的结果 - 委托在表完成其工作之前就被销毁了。
我试过了
MyClass *myObject = [[[MyClass alloc] init] autorelease];
但它也有可怕的后果。
我这里有内存泄漏吗?如果是这样,我如何以及何时安全地释放委托?
【问题讨论】:
【参考方案1】:你的接口文件:
@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
【讨论】:
【参考方案2】:通过在@interface
(.h
文件)中声明 myObject
来创建实例变量,然后调用...
[myObject release];
.. 在您的 dealloc
方法中。
【讨论】:
以上是关于iPhone SDK:我应该如何/何时发布 UITableView 委托对象?的主要内容,如果未能解决你的问题,请参考以下文章
UITextField - 检测内置 iPhone 键盘上的输入?
iphone sdk - Itunes connect 如何更改设备要求?