如何发布几个具有相同委托的类?

时间:2010-11-28 20:24:46

标签: iphone objective-c ios delegates

(或者甚至只有一个有一个代表的班级)

假设我有一个名为DataGetter的类,它从Web下载文件。它有一个委托方法,在下载文件时会触发:

- (void) dataGetterFinished:(DataGetter *)dataGetter;

所以在我的代码中我可以设置几个文件来下载,如下所示:

// in AViewController.m
DataGetter *blueFile = [[DataGetter alloc] init];
blueFile.delegate = self;
[blueFile getData:@"http://example.com/blue-file"];

DataGetter *redFile = [[DataGetter alloc] init];
redFile.delegate = self;
[redFile getData:@"http://example.com/red-file"];

使用clang静态分析器,上面的每个分配行都会得到“在线分配的对象的潜在泄漏...”错误。那么我将如何释放该对象。它必须流连,因为它有一个代表。因此可以将它作为dataGetterFinished方法的最后一行发布,就像这样

- (void) dataGetterFinished:(DataGetter *)dataGetter
{
// code
[dateGetter release];
}

......或者我应该以某种方式使用自动释放?

1 个答案:

答案 0 :(得分:1)

从技术上讲,这样可以正常工作,但我建议在NSMutableArray中跟踪不同的DataGetters。

例如:

DataGetter *blueFile = [[DataGetter alloc] init];
blueFile.delegate = self;
[blueFile getData:@"http://example.com/blue-file"];
[dataGetters addObject:blueFile]; // dataGetters is an NSMutableArray declared in the .h
[blueFile release];

// Same for red

然后在委托方法中,简单地从数组中删除getter:

- (void) dataGetterFinished:(DataGetter *)dataGetter
{
// code
[dataGetters removeObject:dataGetter];
}

数组负责保留对象,但是没有得到分析警告。

请务必在dealloc方法中发布dataGetters。