1

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

我懂了。

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

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

但我不能使用 _Ruta_APP 的值

有人有想法吗?

4

4 回答 4

1

几件事:

试试这个:

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

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

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

于 2010-02-03T18:00:36.393 回答
1

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

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

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

于 2010-02-03T18:02:34.187 回答
0
  1. 似乎您有一个名为 _Ruta_APP 的变量,以及一个同名的实例变量。如果您打算使用实例变量,则无需在方法内重新定义变量。

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

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

于 2010-02-03T18:03:30.537 回答
0

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

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

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

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

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

_Ruta_APP = [[NSBundle mainBundle] bundlePath];

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

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

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

于 2010-02-03T18:18:13.603 回答