2013-05-20 2 views
0

Заявляю сильное свойство:ObjC: сильное свойство с NSString

@property (strong) NSString *message;

И я устанавливаю сообщение как:


self.message = [NSString stringWithFormat:@"xxxx %@",sth]; 

Но вылетал с сообщением:

 
*** -[CFString retain]: message sent to deallocated instance 0x1015ea790 

Даже я меняю свойство: strong-> copy, он по-прежнему падает. Теперь я установил его с помощью:


self.message = [[NSString stringWithFormat:@"xxxx %@",sth] copy]; 

Но я до сих пор не могу понять, как я всегда пишу его таким же образом, в прошивке.

Кстати: код для какао, не-дуги

Update1:

1 Я добавил @synthesize message;

2 СТГ является примером, реальный код

self.message = [NSString stringWithFormat:@"xxxx %@", [[NSDate date] description]];

3 Я помню, что реализация по умолчанию для свойства strong/copy может быть следующим:


- (void)setMessage:(NSString*)newMsg 
{ 
    if (message != newMsg) 
    { 
     [newMsg retain]; 
     [message release]; 
     message = newMsg; 
    } 
} 

SO Я думаю, что свойство-синтез добавит копию/сохранить для меня. Вот что меня смущает!

+3

Что такое 'sth' в примере выше? – Jason

+0

нам нужен пример кода, который вы можете запустить, чтобы показать эту проблему ... потому что это не так, как они должны работать. –

+0

Я не думаю, что сильное означает что-либо вне ARC ... так что просто копия должна работать ... –

ответ

2

Отрицательный дисбаланс счетчика ссылок лежит в коде, который не был опубликован.

Этот вариант является неправильным:

self.message = [[NSString stringWithFormat:@"xxxx %@",sth] copy]; 

- это просто вводит положительный счетчик ссылок дисбаланс (сторона признак эффект: утечка объектов).

Во-первых, исправить все предупреждения анализатора. Если это не исправить, запустите Инструменты. Он может записывать операции счетчика ссылок для каждого объекта: Debugging the EXEC_BAD_ACCESS on Iphone using Performance Tool, Allocations

Примечания который не решит проблему: вы должны использовать copy для NSString собственности, а не strong.

0

В первом случае вы пытаетесь установить строку, используя метод setter, перед тем как создать экземпляр строкового объекта в методе alloc.

Убедитесь, что вы создаете экземпляр объекта String в методе alloc.

В то время как во втором случае вы назначаете скопированный объект этому свойству. поэтому вы не видите ошибку.

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