【问题标题】:How to release several classes which have the same delegate?如何释放具有相同委托的多个类?
【发布时间】:2010-11-28 20:24:45
【问题描述】:

(或什至只有一个班级和一个代表)

假设我有一个名为 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 静态分析器,上面的每个 alloc 行都会出现“在线分配的对象的潜在泄漏......”错误。那么我将如何释放该对象。它必须闲逛,因为它有一个代表。那么作为dataGetterFinished方法的最后一行放出来可以吗,像这样

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

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

【问题讨论】:

    标签: iphone objective-c ios delegates


    【解决方案1】:

    从技术上讲,这很好用,但是我建议跟踪 NSMutableArray 中的不同 DataGetter。

    例如:

    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。

    【讨论】:

    • 谢谢!使用 NSMutableArray 而不是仅在委托方法中释放类有什么优势?只是为了取悦铮神吗?
    • 是的,我会这么说,如果您想稍后访问 dataGetters,您可以查看数组。我一直觉得这是一种更整洁的方式。
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2022-06-15
    • 2013-08-19
    相关资源
    最近更新 更多