1

Objective-C クラスにstatic を追加したいのNSStringですが、メモリの管理に不安があります。

NSString *myImportantString = 0;

@implementation MySingletonClass

/* Option 1 */
+ (void)initialize {
    myImportantString = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"criticalFolder"];
}


/* Option 2 */
+ (void)initialize {
    NSString *tmp = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"criticalFolder"];
    myImportantString = [[NSString alloc] initWithString:tmp];
}

オプション 1 ではmyImportantString、自動解放されたオブジェクトですが、いつどこで解放されるかを知るにはどうすればよいですか? この不確実性により、代わりにオプション 2 を使用するようになりました。ただし、ARC を使用しているため、どのように/いつ (もしあれば?) リリースされますか? メソッドによると、 は+initializeメソッドでmyImportantString再度使用されないため、ARCreleaseはメソッドの最後に適切なコードを挿入しません+initializeか?

私は(比較的)正しく処理されると確信していますが、それでもどのように機能するか知りたいです.

4

2 に答える 2

4

グローバル変数のmyImportantStringデフォルトは であるため、オプション 1 で問題ありませんstrong。文字列が解放されることはありません (これはグローバルでは問題ありません)。

于 2012-12-06T04:48:52.480 に答える
2

所有権修飾子を指定しない場合、LLVM コンパイラはそれを __strong として扱います。つまり、自動解放について心配する必要はありません。また、静的変数の寿命がアプリケーションの寿命と同じであることを考えると、いつ解放されるかについて心配する必要はありません (おそらく決して解放されませんが、それに関するドキュメントを紹介することはできません)。したがって、両方のオプションで問題ありません。

于 2012-12-06T04:48:41.903 に答える