释放Objective-c中的返回对象错误

时间:2012-06-08 03:00:58

标签: objective-c ios xcode memory-management

我有这个代码,其中我分配一个NSMutableIndexSet并返回此集合中的对象以用于其他方法。这是代码:

  

NSMutableIndexSet * indexes = [NSMutableIndexSet new];

for (NSNumber * number in bookmarksArray)
{
    [indexes addIndex:[number intValue]];
}

return indexes;

在研究如何释放返回的对象时,我将上面的代码编辑为:

  

return [indices autorelease];

然而,它给了我一个错误,说消息已发送到解除分配的实例。我该怎么办?有什么建议吗?

3 个答案:

答案 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
}