问题很简单。我是否需要发布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。
答案 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)。