【问题标题】:warning on nsbundle bundlepathnsbundle 捆绑路径上的警告
【发布时间】: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 的值

有人有想法吗?

【问题讨论】:

    标签: cocoa nsbundle


    【解决方案1】:

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

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

    [_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】:
    1. 您似乎有一个名为 _Ruta_APP 的变量,以及一个同名的实例变量。如果要使用实例变量,则不需要在方法内部重新定义变量。

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

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

    【讨论】:

    • 谢谢。但如果我删除它,警告不会消失。似乎我得到了对象 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 开始。英语不是我的母语,谢谢你的建议,我会调试我所有的代码。
    猜你喜欢
    • 2014-11-02
    • 2016-07-09
    • 2018-03-26
    • 2011-03-30
    • 2011-06-24
    • 1970-01-01
    • 2014-11-11
    • 2011-04-23
    • 2015-01-04
    相关资源
    最近更新 更多