我需要释放这个对象吗?

时间:2011-05-31 15:21:08

标签: iphone xcode ios memory-management

我是否必须释放returnSet变量?

NSMutableSet* returnSet = [[NSMutableSet alloc] init];
    for (Information* currentInformation in self.information) {
        if ([currentInformation.player isEqual:aPlayer]) {
            [returnSet addObject:currentInformation];
    }
}
return [NSSet setWithSet:returnSet];

感谢您的回答, 基督教

6 个答案:

答案 0 :(得分:4)

通常在编写返回新创建对象的方法时(如示例所示),应返回自动释放的对象。因此,遵循惯例,您的代码将成为:

NSMutableSet* returnSet = [[NSMutableSet alloc] init];
    for (Information* currentInformation in self.information) {
        if ([currentInformation.player isEqual:aPlayer]) {
            [returnSet addObject:currentInformation];
    }
}
return [returnSet autorelease];

请注意,即使您的方法签名指定了NSSet,也可以从方法返回可变集,因为NSMutableSet是NSSet的子类。当您使用此方法时,如果您不希望返回的对象粘在一起,则不执行任何操作,它将被取消分配。如果您希望以后可以访问它,请将其分配给成员变量并保留它,或将其放在另一个保留的数据结构(set,dictionary,array)中。

<强>更新 要澄清关于此答案正确性的一些明显混淆,请参阅http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html处的“从方法中返回对象”部分。

答案 1 :(得分:3)

是。一般情况下,如果您alloc,则需要releaseautorelease

答案 2 :(得分:2)

是的,你分配了它(你拥有它),所以你需要释放它。

答案 3 :(得分:1)

是。这是内存泄漏。您需要创建NSSet结果变量,释放returnSet并返回结果。

答案 4 :(得分:0)

是的,你这样做。你可以这样做一个简单的自动释放:

[returnSet autorelease];
return returnSet;

使用autorelease可以让您有时间将返回的值分配给调用它的函数中的其他值。在调用函数可以对返回执行任何操作之前,立即释放将释放对象。由于它是在此函数中创建的,因此在此函数中处理自动释放也是一种很好的做法。它使生活变得更加轻松,而不必每次调用此函数时都记得发布。

答案 5 :(得分:0)

@bensnider绝对正确 - 返回一个自动释放的对象。

但是,我个人更愿意返回一个不可变的集合以防止以后发生事故:)

我很想写这个:

NSMutableSet *returnSet = [[NSMutableSet set];
    for (Information* currentInformation in self.information) {
        if ([currentInformation.player isEqual:aPlayer]) {
            [returnSet addObject:currentInformation];
    }
}
return [NSSet setWithSet:returnSet];

然后使用隐式自动释放创建resultSet,这样您就不必担心它并返回一个不可变对象。

(虽然这样做的缺点是你正在制作两套 - 可能不是问题,但如果多次调用这种方法你可能想重新考虑我的答案!)