2012-06-18 2 views
0

Мне просто интересно, как я могу сделать копию NSMutableAttributedString. У меня есть свойство, называемое text, что я хотел бы сохранить его содержимое в определенный момент и вернуться к нему, если что-то случится. Я попытался сделать свойство textCopy где я могу сохранить его с @property (nonatomic, copy), но я получаю сообщение об ошибке выполнения, когда я делаю это:Как скопировать NSMutableAttributedString

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

Как бы это сделать?

Обновлено с ошибкой времени выполнения. Я получаю это в любое время, когда я устанавливаю NSMutableAttributedString в @property (nonatomic, copy). Не понимая, почему это не сработает, в общем случае параметр копирования не работает с NSMutableAttributedString, независимо от того, использую ли я его метод setter или нет.

+0

Вы пробовали 'NSAttributedString * temp = [[NSAttributedString alloc] initWithAttributedString: [text mutableCopy]]; NSMutableAttributedString * textCopy = [temp mutableCopy]; '? –

+1

Какая у вас ошибка времени выполнения? – TheAmateurProgrammer

+0

@ theAmateurProgrammer - Я обновил вопрос с помощью cerror. –

ответ

4

Проблема заключается в том, что вы объявили свойство с атрибутом copy и предположительно используете созданный компилятором сеттер. Сгенерированный компилятором сеттер отправляет сообщение copy объекту, чтобы сделать копию. Сообщение copy делает копию неизменной. То есть, он создает NSAttributedString, не a NSMutableAttributedString.

Один из способов исправить это, чтобы написать свой собственный сеттер, который использует mutableCopy, как это, если вы используете ARC:

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

или как это, если вы используете ручной подсчет ссылок:

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

Другим решением было бы сделать textCopyNSAttributedString вместо NSMutableAttributedString и сделать остальную часть вашего кода работой с ним как неизменяемым объектом.

+0

спасибо Робу, на месте, как обычно. Был еще вопрос: что, если я просто использовал @property (неатомный, сохранить) для обоих, и когда я хочу сделать копию, сделайте что-то вроде этого: NSMutableAttributedString * textCopyTemp = [text mutableCopy]; textCopy = textCopyTemp; [textCopyTemp release]; –

+0

Этот средний оператор должен быть 'self.textCopy = textCopyTemp;', чтобы избежать утечки копии. –

Смежные вопросы