nsbundle 捆绑路径上的警告

Posted

技术标签:

【中文标题】nsbundle 捆绑路径上的警告【英文标题】:warning on nsbundle bundlepath 【发布时间】:2010-02-03 17:57:54 【问题描述】:

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

我明白了。

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

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

但我不能使用 _Ruta_APP 的值

有人有想法吗?

【问题讨论】:

【参考方案1】:

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

    您不必在方法中声明实例变量。 在分配另一个字符串之前,您不必使用空字符串初始化变量。 然后您应该保留实例变量对象:

[_Ruta_APP autorelease]; _Ruta_APP = [[[NSBundle mainBundle] bundlePath] copy];

【讨论】:

i 表示另一个小括号和副本。 实际上,这个答案有很多细节“成功了”。我建议您努力了解答案中代码与原始代码之间差异的详细信息,否则您可能会一遍又一遍地重复相同的错误。 对不起,我不知道这个 _Ruta_APP = [[NSBundle mainBundle] bundlePath];有了这个,我正在复制 nsbundle 的指针而不是内容。并通过“复制”将内容复制到新的 NSString【参考方案2】:

几件事:

试试这个:

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

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

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

【讨论】:

“试试这个”的意思是“解决真正的错误,不要从中吸取教训”。 @Freaktor 的问题显然是实例变量的阴影。这个答案的第一个版本中没有解释这一点。另外,关于私有实例变量的最后一件事是错误的。【参考方案3】:

    您似乎有一个名为 _Ruta_APP 的变量,以及一个同名的实例变量。如果要使用实例变量,则不需要在方法内部重新定义变量。

    代码段中的第一行创建了一个您从不使用并且泄漏的对象。

所以我想说,只要从你的代码片段中删除第一行,警告就会消失。

【讨论】:

谢谢。但如果我删除它,警告不会消失。似乎我得到了对象 nsbundle 的一个新实例,而编译器简直发疯了:P【参考方案4】:

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

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

现在让我们来看看你在实现hard way中遇到的问题:

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

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

_Ruta_APP = [[NSBundle mainBundle] bundlePath];

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

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

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

【讨论】:

我明白了。几周前我刚从目标 c 开始。英语不是我的母语,谢谢你的建议,我会调试我所有的代码。

以上是关于nsbundle 捆绑路径上的警告的主要内容,如果未能解决你的问题,请参考以下文章

Retina 图形未从 NSBundle 加载

现有路径的 NSBundle“尚未加载”

在捆绑包 NSBundle 中找不到名为“Storyboard.storyboard”的故事板

Xcode 11 在捆绑包 NSBundle 中找不到名为“Main”的情节提要

NSBundle 的主体类

使用 NSBundle 加载我的资源