2010-02-03 55 views
1

我想獲取我的包的可執行路徑。 (我想得到的路徑,所以我可以加載圖像在NSImageView)nsbundle bundlepath上的警告

我明白了。

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

但是編譯器說 /ControlAPP.m:33:0 /ControlAPP.m:33:警告:_Ruta_APP「屬地申報隱藏實例變量

,但我不能使用_Ruta_APP的價值

任何人都有想法?

回答

1

如果你真的想保留一個實例變量的路徑,只需要殺死第一行。

  1. 您不必在方法中聲明實例變量。
  2. 在分配另一個字符串之前,您不必使用空字符串初始化變量。
  3. 你應該再保留實例變量對象:

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

+0

這一個伎倆 – Freaktor 2010-02-03 20:43:51

+0

我的意思是另一個braket和副本。 – Freaktor 2010-02-03 20:45:08

+1

其實,這個答案的細節有很多,「做了詭計」。我建議您努力理解答案中的代碼差異以及原始代碼的細節,否則您可能會一遍又一遍地重複相同的錯誤。 – bbum 2010-02-04 03:51:05

1

幾件事情:

試試這個:

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

,你得到的警告似乎表明,你也有相同的名稱,在你的代碼是局部變量的實例變量片段。

帶下劃線的實例變量可能也是一個壞主意,因爲這是Apple用於隱藏/私有ivars的。我認爲在你自己的代碼中使用它們被認爲是不好的風格。

+0

爲什麼downvotes?這是一個很好的答案。 – kubi 2010-02-03 18:03:52

+0

「試試這個」意思是「解決真正的錯誤,不要從中學習」。 @Freaktor的問題顯然是實例變量的陰影。這個答案在第一個版本中沒有解釋。另外,關於私有實例變量的最後一件事情是錯誤的。 – 2010-02-03 18:10:39

0
  1. 好像你有一個名爲_Ruta_APP變量,以及同名的實例變量。如果你的意思是使用實例變量,你不需要重新定義方法內的變量。

  2. snippit中的第一行創建了一個永遠不會使用的對象,它會泄漏。

所以我會說,只是從你的snippit中刪除第一行,警告應該消失。

+0

謝謝。但如果我刪除它,警告不會消失。 看來,我得到了對象nsbundle的新實例,並且complilator只是瘋了:P – Freaktor 2010-02-03 20:46:41

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作爲局部變量,而不是任何其他實例方法,請剪切實例變量。

+0

我明白了。我剛剛在幾周前開始用客觀的c。和英語不是我的母語,感謝您的建議,我會調試我所有的代碼。 – Freaktor 2010-02-03 20:45:30