我有这个代码,其中我分配一个NSMutableIndexSet并返回此集合中的对象以用于其他方法。这是代码:
NSMutableIndexSet * indexes = [NSMutableIndexSet new];
for (NSNumber * number in bookmarksArray)
{
[indexes addIndex:[number intValue]];
}
return indexes;
在研究如何释放返回的对象时,我将上面的代码编辑为:
return [indices autorelease];
然而,它给了我一个错误,说消息已发送到解除分配的实例。我该怎么办?有什么建议吗?
答案 0 :(得分:2)
当运行循环到达它们时(或者当您手动耗尽自动释放池时)释放自动释放的实例。这意味着接收从您的方法返回的NSMutableIndexSet
实例的方法需要在将控件放回运行循环之前保留它。否则,实例将被释放,呈现您可能无效的任何引用。
有一个快捷方式可以调用[NSMutableIndexSet new]
然后自动释放实例:你可以像这样调用indexSet
类方法:
NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
// Populate the indexes...
return indexes;
答案 1 :(得分:1)
如果您使用自动参考计数(ARC),则应使用:
- (NSMutableIndexSet *)bookmarkIndexes
{
NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];
for (NSNumber *number in bookmarksArray)
{
[indexes addIndex:[number intValue]];
}
return indexes;
}
如果您不使用ARC,那么您确实需要自动释放:
- (NSMutableIndexSet *)bookmarkIndexes
{
NSMutableIndexSet *indexes = [[[NSMutableIndexSet alloc] init] autorelease];
for (NSNumber *number in bookmarksArray)
{
[indexes addIndex:[number intValue]];
}
return indexes;
}
答案 2 :(得分:1)
问题可能就像你从这个方法得到的实例如果你把它设置为ivar那样不会被保留。
return [indexes autorelease]; //this is ok.
但在其他方法中,您调用此方法来获取索引,如果您希望返回的实例索引保持在该方法之外,则应保留它。因为你得到的实例是自动释放的,它通常会从方法中解除分配。(下一步运行循环)
NSMutableIndexSet *iVarIndexes;
- (void)otherMethod
{
iVarIndexes = [[self getBookmarkIndexes] retain]; //for later use
}