nsbundle bundlepath上的警告

时间:2010-02-03 17:57:54

标签: cocoa nsbundle

我想获取我的捆绑包的可执行路径。 (我想获得路径,以便我可以在NSImageView中加载图像)

我得到了这个。

NSString * _Ruta_APP = [[NSString alloc] init];
_Ruta_APP = [[NSBundle mainBundle] bundlePath];

但是编译器说     /ControlAPP.m:33:0 /ControlAPP.m:33:警告:'_Ruta_APP'的本地声明隐藏了实例变量

但我无法使用_Ruta_APP

的值

有人有想法吗?

4 个答案:

答案 0 :(得分:1)

一些事情:

请改为尝试:

NSString* imagePath = [[NSBundle mainBundle] pathForResource @"SomeImage" ofType: @"png"]

您收到的警告似乎表明您的代码段中还有一个与该局部变量同名的实例变量。

带下划线的实例变量可能也是一个坏主意,因为这是Apple用于隐藏/私有ivars的内容。我认为在你自己的代码中使用它们被认为是不好的风格。

答案 1 :(得分:1)

如果您真的想将路径保留在实例变量中,只需删除第一行。

  1. 您不必在方法中声明实例变量。
  2. 在分配另一个字符串之前,您不必使用空字符串初始化变量。
  3. 然后您应该保留实例变量对象:
  4. [_Ruta_APP autorelease];
    _Ruta_APP = [[[NSBundle mainBundle] bundlePath] copy];

答案 2 :(得分:0)

  1. 看起来你有一个名为_Ruta_APP的变量,以及一个同名的实例变量。如果您要使用实例变量,则无需在方法内重新定义变量。

  2. snippit中的第一行会创建一个您从未使用过的对象,并且会泄漏。

  3. 所以我要说只是从你的snippit中删除第一行,警告就会消失。

答案 3 :(得分:0)

  

(我想获得路径,以便我可以在NSImageView中加载图像)

您不需要可执行文件的路径来执行此操作。最简单的方法是NSImage's imageNamed: method;第二个最简单的是St3fan建议的。

现在让我们来解决你实施困难的问题:

NSString * _Ruta_APP = [[NSString alloc] init];

这声明了一个名为_Ruta_APP的局部变量,并初始化它以保存NSString对象,因为您使用alloc创建了它并且尚未释放它。

_Ruta_APP = [[NSBundle mainBundle] bundlePath];

这会将不同的字符串对象放入同一个变量中,替换第一个变量。如果你没有使用垃圾收集,那么第一个对象仍然存在,你仍然拥有它,即使你不再有办法发送它的消息。因此,你已经泄露了它。

如果您打算将_Ruta_APP作为实例变量,则剪切整个第一行。在实例变量中保存您不拥有的对象通常是个坏主意,因此请获取此对象的所有权;最好的方法是复制(在这样做之后,你将拥有副本)并将其放在实例变量中。否则,当原始对象释放它的任何东西时,该对象将会死亡,但你仍然会持有它;然后你会向一个死对象发送一条消息,这会使你的应用程序崩溃。请参阅the memory management rules

如果您打算将_Ruta_APP作为局部变量,而不是任何其他实例方法,请剪切实例变量。