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 捆绑路径上的警告的主要内容,如果未能解决你的问题,请参考以下文章
在捆绑包 NSBundle 中找不到名为“Storyboard.storyboard”的故事板