返回 NSArray 元素

Returning NSArray element

在返回 NSArray 元素的 MRC 代码中,如下所示:

NSString* MyName()
{
    NSArray *names = [NSArray arrayWithArray:[[NSHost currentHost] names]];
    return [names objectAtIndex:0];
}

void BullCrap()
{
    NSString *wouldItBeRetainedAutomatically = MyName();
}

wouldItBeRetainedAutomaticallyBullCrap() 范围内?我假设我不需要发送 wouldItBeRetainedAutomatically retain 消息来确保它在 MyName() 中的 names 被释放后仍然可用?或者 namesBullCrap() 完成之前不会被释放?

注意:我知道我应该使用 ARC,但我不能。

在这种情况下,看起来你不应该做任何事情,只是因为你说 listOfNames 是由系统 API 返回的,而这个方法是(以一种非常人为的方式)添加它到然后将其从将被销毁的数组中删除。因此,数组暂时保留了 listOfNames 但实际上并没有改变任何东西,并且 listOfNames 已经自动释放(取决于它的实际创建方式)。

显然有一个关于 listOfNames 实际来源的大量警告...

为了完全确定这个问题的答案是正确的,有必要查看 listOfNames 的来源。这将告诉我们系统框架和您的调用代码之间制定了什么样的内存管理契约。

话虽如此,可以肯定地说系统框架已经自动释放了 return 并存储在 listOfNames 中的 NSArray。因此 listOfNames 将在自动释放池被刷新后立即释放并消失。您使用 arrayWithArray 创建 name 数组,这也将 return 一个自动释放的实例。

但是,您具体询问 listOfNames(或 names)的第一个元素的内存管理 "state",即 return 由 MyName 函数。这几乎肯定只被 listOfNames 数组(和 names 数组)保留。 (同样,上面的警告仍然有效)。鉴于 listOfNames(和 names)将很快自动释放,数组的元素也将被释放。

因此,您可能应该 return 来自 MyName 的元素并调用 autorelease,然后在需要时将 wouldItBeRetainedAutomatically 保留在 BullCrap 中坚持下去。您显示的代码中没有任何内容表明它将自动为您保留。

附带说明一下,您创建的 names 数组在您给出的示例中是不必要的。同样可以实现如下:

NSString* MyName()
{
    //listOfNames is returned by SystemFramework API
    return [listOfNames objectAtIndex:0];
}

使用中间的 names 数组只会混淆问题。