我是否必须释放returnSet变量?
NSMutableSet* returnSet = [[NSMutableSet alloc] init];
for (Information* currentInformation in self.information) {
if ([currentInformation.player isEqual:aPlayer]) {
[returnSet addObject:currentInformation];
}
}
return [NSSet setWithSet:returnSet];
感谢您的回答, 基督教
答案 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
,则需要release
或autorelease
。
答案 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,这样您就不必担心它并返回一个不可变对象。
(虽然这样做的缺点是你正在制作两套 - 可能不是问题,但如果多次调用这种方法你可能想重新考虑我的答案!)