1

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

NSMutableIndexSet *indexes = [NSMutableIndexSet new];

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

return indexes;

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

返回[索引自动释放];

但是,它给了我一个错误,说该消息已发送到已释放的实例。我该怎么办?有什么建议么?

4

3 回答 3

2

自动释放的实例在运行循环到达它们时被释放(或者当您手动耗尽自动释放池时)。这意味着接收NSMutableIndexSet从您的方法返回的实例的方法需要在将控制权交给运行循环之前保留它。否则,实例将被释放,呈现您可能无效的任何引用。

有一个调用[NSMutableIndexSet new]然后自动释放实例的快捷方式:您可以indexSet像这样调用类方法:

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
// Populate the indexes...
return indexes;
于 2012-06-08T03:10:39.407 回答
1

如果您将其设置为 ivar 左右,问题可能就像您从此方法获得的实例不会保留。

return [indexes autorelease]; //this is ok. 

但是在其他方法中,您调用此方法来获取索引,如果您希望返回的实例索引保留在该方法之外,您应该保留它。因为你得到的实例是自动释放的,它通常会从方法中释放出来。(下一个运行循环在这里)

NSMutableIndexSet *iVarIndexes;

- (void)otherMethod
{
    iVarIndexes = [[self getBookmarkIndexes] retain]; //for later use
}
于 2012-06-08T05:59:54.143 回答
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;
}
于 2012-06-08T03:09:33.430 回答