5

プロパティがまたはNSMutableStringであるべきかどうかを調査するために、小さな Xcode プロジェクトを開始しました。私は自分のプロパティを属性で宣言しました:copyretaincopy

@property (nonatomic,copy) NSMutableString *stringA;

次に、次のように初期化しましたself.stringA = [NSMutableString new];

最後に文字列を設定しようとしました[stringA setString:@"A"];

ただし、プログラムは、

「キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'setString で不変オブジェクトを変更しようとしています:'」

NSString結果の文字列が これは、属性NSMutableStringを使用してプロパティを宣言し、を使用してプロパティを宣言する必要があるということですか?retainNSStringcopy

4

2 に答える 2

11

そうです、のcopyメソッドはimmutableNSMutableStringを返します。これは Cocoa の規則であり、、 などにも適用されます。 NSStringNSMutableArrayNSMutableDictionary

したがって、プロパティを可変のままにしたい場合は、 として宣言する必要がありますretain。コピー セマンティクスが必要であるが、結果を変更可能にしたい場合は、プロパティに独自のセッターを実装する必要があります (mutableCopyコピーを行うために使用します)。

文字列プロパティについてよく目にする理由copyは、プロパティに割り当てられている文字列の種類に関係なく、文字列が不変であることを保証することが望ましい場合が多いためです。そうしないと、誤って同じ文字列を他の場所で変更してしまう可能性があり、デバッグが困難になる可能性があります。不変オブジェクトには、スレッドセーフであるという利点もあります。

于 2012-08-16T17:55:44.317 に答える
-1

最初の質問は、stringA がどのように初期化されたかです。プレーンな文字列から設定すると、それが原因である可能性があります。Copy と Retain は実際には異なるパフォーマンスを発揮するため、どちらか一方を使用する理由を理解する必要があります。

コピーは実際にメモリのコピーを作成しているため、そのプロパティに加えた変更は元の設定に影響しません。保持はメモリの保持カウントをインクリメントするだけなので、完了するまで解放されません。それを参照しています。

于 2012-08-16T17:52:48.037 に答える