1

NSStrings に関する簡単な質問ですが、文字列に値を割り当てるコードがあります。見つかったものに応じて、substringToIndex または定数文字列 @"0.00" によって値が割り当てられます。使用しても問題ありませんか

// Save if value found, otherwise set to 0.00
if (parsedCharacters == nil || [parsedCharacters isEqualToString:@""])
        self.currentDiscountedPrice = @"0.00";
else
{
  // Truncate extra digits from string to 2 decimal places (find full stop, save 2 places after it)
  NSRange fullStopRange = [parsedCharacters rangeOfString:@"."];
  self.currentDiscountedPrice = [parsedCharacters substringToIndex:(fullStopRange.location + 3)];
}

古い値を解放して新しい値を保持するため、割り当ての場合は?

前の繰り返しで var に定数文字列が割り当てられたのか、それとも substringToIndex の戻り値が割り当てられたのかを知る方法はありませんが、定数文字列に対して保持と解放を呼び出すことは無害であると言われましたが、これは本当ですか?

4

1 に答える 1

1

NSString は特別なものではありません。すべての Cocoa オブジェクトは、Cocoa のメモリ管理規則に従います。あなたもそうしていれば大丈夫です。

定数文字列での保持と解放の呼び出しは無害だと言われましたが、これは本当ですか?

はい。所有していない他の文字列と同じように扱う必要があります。所有したい場合は保持するか、コピーを作成して所有します。次に、所有しているものを必ずリリースしてください。

…古い値を明示的に解放して値を保持する必要がありますか、それとも両方の割り当てsubstringToIndexに使用しても問題ありませんか?self.currentDiscountedPrice =

メソッドinitdealloc. これらは、インスタンス変数内のオブジェクトに明示的にメッセージをretain送信する必要がある唯一のメソッドです。release

その段落の両側の理由は、ユーザーまたはサブクラスがプロパティのカスタム アクセサーを実装する可能性があるためです。カスタム動作は、半分初期化または半分ロック解除されたオブジェクトで実行するのは危険かもしれませんが、それ以外の場所ではおそらく必要になるでしょう。

定数文字列オブジェクトをプロパティ セッターに渡しても害はありません。通常どおり、オブジェクトを保持またはコピーします。

その点で、プロパティの値が変更可能なバリアントを持つクラスのオブジェクトである場合 (NSString には NSMutableString があるため)、誰かの共同所有権を取得しないように、プロパティをその値をコピーするもの (@property(copy)または) として宣言する必要があります。 @property(nonatomic, copy)else の可変オブジェクト。それらがオブジェクトを変更すると、特にオブジェクトをインスタンス変数ではなくハッシュ コレクション (辞書キーなど) に格納した場合に、問題が発生する可能性があります。

于 2010-08-09T09:18:09.187 に答える