返回 NSArray 元素
Returning NSArray element
在返回 NSArray 元素的 MRC 代码中,如下所示:
NSString* MyName()
{
NSArray *names = [NSArray arrayWithArray:[[NSHost currentHost] names]];
return [names objectAtIndex:0];
}
void BullCrap()
{
NSString *wouldItBeRetainedAutomatically = MyName();
}
wouldItBeRetainedAutomatically
在 BullCrap()
范围内?我假设我不需要发送 wouldItBeRetainedAutomatically
retain
消息来确保它在 MyName()
中的 names
被释放后仍然可用?或者 names
在 BullCrap()
完成之前不会被释放?
注意:我知道我应该使用 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
数组只会混淆问题。
在返回 NSArray 元素的 MRC 代码中,如下所示:
NSString* MyName()
{
NSArray *names = [NSArray arrayWithArray:[[NSHost currentHost] names]];
return [names objectAtIndex:0];
}
void BullCrap()
{
NSString *wouldItBeRetainedAutomatically = MyName();
}
wouldItBeRetainedAutomatically
在 BullCrap()
范围内?我假设我不需要发送 wouldItBeRetainedAutomatically
retain
消息来确保它在 MyName()
中的 names
被释放后仍然可用?或者 names
在 BullCrap()
完成之前不会被释放?
注意:我知道我应该使用 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
数组只会混淆问题。