2011-03-02 57 views
4

问题很简单。我需要发布一个NSLocalizedString吗?例如:我必须发布一个NSLocalizedString吗?

NSString *internetMessageTitle = NSLocalizedString(
@"You are currently not connected to a internet network" 
@"Title of the message that tells the user there is no internet network"); 

因为我这样做:

NSLog(@"Retain count of InternetMessageTitle is: %d", 
              [internetMessage retainCount]); 

但它打印为2的保留数不过我已经阅读了retainCount属性不是很可靠。我应该释放两次吗?

是的,我已阅读内存管理规则和文档指南,但我没有看到任何迹象表明NARC(NewAllocRetainCopy)。我仍然是初学者,所以我不知道NSLocalizedString如何创建字符串。

谢谢!编辑1:我在UIAlertView中使用这个变量我不知道当我使用它时,retainCount是否增加。即使不使用警报(在if内部,并且如果忽略它,它也不会被使用),根据NSLog,retainCount仍然是2。

回答

8

不,你不能释放它。如果检查NSLocalizedString是如何定义的,你会看到:

#define NSLocalizedString(key, comment) \ 
     [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

那其常以一个NSBundle的方法的调用返回自动释放的字符串

我使用这个变量在UIAlertView中 我不知道如果在我使用它时增加了retainCount为 。并且 即使未使用警报 (在if中,如果if为 ,则跳过它不使用),根据NSLog,retainCount 仍然为2。

是的,UIAlert中的标签会保留它们的内容字符串,但是您不应该担心 - 它们会在被销毁时释放它们。

+0

那么为什么是retainCount 2?或者它只是误导?如果我释放它,为什么它不会崩溃? – Joze 2011-03-02 08:52:38

+3

'retainCount'应该很少用于调试。如果你看看Apple自己的文档,你会发现它通常不是很有用。 – lxt 2011-03-02 08:56:28

+0

我猜:1保留 - 用于创建(将由autorelease池处理),第二个保留 - 通过警报标签 - 将在标签析构函数中处理。不知道为什么你不会崩溃...可能警觉不会在那个时候被释放 - 你的程序可能会在稍后崩溃,比如在警报关闭后(如此调用dealloc方法) – Vladimir 2011-03-02 08:57:07

1

正如你所说,没有NARC - 所以你已经知道答案是否定的。

你读过关于保留数的内容吗?注意它。永远不要将保留计数看作有用的信息。 永远不要看这一切。

而FFS不会做一些疯狂的事情,比如在一个对象上多次调用release,因为你认为它的保留次数> 1。这些东西绝对保证会让你感到困惑。

0

Cocoa memory management rules非常简单。结果只有一个:所有的alloc/new */* copy *调用必须通过调用自动/释放来平衡。你没有调用名为“alloc”的方法或函数,以“new”开头或包含“copy”,因此你不应该发布。

即使比以下内存规则更简单的是在可能的情况下使用properties(object或class)。

相关问题