1

バンドルの実行可能パスを取得したい。(NSImageViewに画像をロードできるようにパスを取得したい)

私はこれを得た。

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

しかしコンパイラは /ControlAPP.m:33:0 /ControlAPP.m:33: warning: local Declaration of '_Ruta_APP' hides instance variable と言っています

しかし、_Ruta_APP の値は使用できません

誰にもアイデアがありますか?

4

4 に答える 4

1

いくつかのこと:

代わりにこれを試してください:

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

表示されている警告は、コード スニペットのローカル変数と同じ名前のインスタンス変数もあると示しているようです。

アンダースコアを含むインスタンス変数もおそらく悪い考えです。これは Apple が非表示/プライベート ivar に使用するものだからです。独自のコードでそれらを使用するのは悪いスタイルと見なされると思います。

于 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:メソッドです。2 番目に簡単なのは、St3fan が提案したものです。

それでは、難しい方法の実装における問題を見ていきましょう。

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 に答える