我是否必须发布NSLocalizedString?

时间:2011-03-02 08:47:03

标签: iphone objective-c

问题很简单。我是否需要发布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如何创建字符串。

谢谢!

EDIT1:我在UIAlertView中使用这个变量我不知道当我使用它时是否增加了retainCount。即使没有使用警报(在if内部,如果if被跳过则不使用),根据NSLog,retainCount仍为2。

3 个答案:

答案 0 :(得分:8)

不,你不能发布它。如果你检查NSLocalizedString的定义方式,你会看到:

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

它通常是对NSBundle方法的调用,返回自动释放的字符串

  

我在UIAlertView中使用此变量   我不知道retainCount是否   当我使用它时增加了。和   即使没有使用警报   (在if中,如果是,则为   跳过它没用过)retainCount   根据NSLog,仍然是2。

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

答案 1 :(得分:1)

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

你读到的关于保留计数的内容是什么?注意它。永远不要将保留计数视为有用的信息。 永远不要看这一切。

并且FFS不会做一些疯狂的事情就像在对象上多次调用release一样,因为你认为它有一个保留计数>这个东西绝对可以让你搞砸。

答案 2 :(得分:0)

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

比遵循内存规则更简单的方法是尽可能使用properties(object或class)。