0

のコピーを作成する方法を考えていますNSMutableAttributedStringtext特定の時点でその内容を保存し、何かが発生した場合に元に戻したいというプロパティがあります。私はtextCopyそれを保存できる場所と呼ばれるプロパティを作成しようとしまし@property (nonatomic, copy)たが、これを行うとランタイムエラーが発生します:

 -[NSConcreteAttributedString insertAttributedString:atIndex:]: unrecognized selector sent to instance.

どうすればこれを達成できますか?

実行時エラーで更新されました。NSMutableAttributedString を に設定すると、いつでもこれを取得でき@property (nonatomic, copy)ます。なぜこれが機能しないのか理解できません。一般に、セッターメソッドを使用しているかどうかにかかわらず、コピーパラメーターは NSMutableAttributedString で機能しないようです。

4

1 に答える 1

4

問題は、属性を使用してプロパティを宣言し、copyおそらくコンパイラで生成されたセッターを使用していることです。コンパイラによって生成されたセッターはcopy、コピーを作成するためにメッセージをオブジェクトに送信します。copyメッセージは不変のコピーを作成します。つまり、NSAttributedStringではなく、を作成しNSMutableAttributedStringます。

mutableCopyこれを修正する1つの方法は、ARCを使用している場合のように、を使用する独自のセッターを作成することです。

- (void)setTextCopy:(NSMutableAttributedString *)text {
    textCopy = [text mutableCopy];
}

または、手動の参照カウントを使用している場合は、次のようになります。

- (void)setTextCopy:(NSMutableAttributedString *)text {
    [textCopy release];
    textCopy = [text mutableCopy];
}

もう1つの修正はtextCopy、のNSAttributedString代わりにNSMutableAttributedStringを作成し、コードの残りの部分を不変オブジェクトとして機能させることです。

于 2012-06-19T04:09:54.650 に答える