1

クラスに次のようなプロパティがある場合:\

@interface Test

NSString *str;

@end

そして、.mの私の初期化で:

str = @"Test";

クラスの dealloc で手動で解放する必要がありますか?

この種はどうですか?

NSString *myStr = [NSString stringWithFormat:@"%@", someString];

それも解放する必要がありますか?

4

4 に答える 4

2

本当にARCを使用する必要がありますが、特定の質問に答えるには、いいえ:それらをリリースする必要はありません。自分が「所有」しているものだけを解放し、[ newallocretaincopy] のいずれかを含むメソッドから取得したものだけを所有します。

つまり、これらの文字列を所有していないため、それらを保持する必要がある場合は保持 (またはコピー) する必要があります。

于 2012-09-27T21:47:54.300 に答える
1

どちらのコンストラクト1も、自動解放された文字列を作成します。それらを (明示的に、または保持されたプロパティに割り当てることによって) 行う必要がありretainます。そうしないと、自動解放が呼び出されると、ダングリング参照が発生します2retainオブジェクトでa を呼び出したら、それを解放するのはあなたの責任になります。

s のより堅牢なアプローチは、プロパティを保持するのではなく、プロパティNSStringを使用することです。copyそうすることで、コンテンツを検証した後にメソッドに NSMutableString渡された が変更された場合の問題を回避できます。init


1 ARC より前のバージョンの Objective C ツールについて質問されていると思います。retainそうしないと、 orをrelease明示的に呼び出すことができません。

2これは通常、メソッドを終了してからしばらくたってから発生し、制御は実行ループに戻ります。

于 2012-09-27T21:48:04.363 に答える
1

ARC を使用しているかどうかわからない場合は、解放/保持してみてください。リリース/保持できないという警告が表示された場合は、ARC が有効になっています。それ以外の場合は無効になっているため、保持してリリースする必要があります。

于 2012-09-27T21:55:18.890 に答える
1

プロジェクトで ARC を使用している場合は、リリースする必要はありません (自動参照カウント)。ARC は iOS 5 以降で有効になっているため、iOS 5 以降をターゲットにしている場合は、何もリリースする必要はありません。

于 2012-09-27T21:44:54.530 に答える