NSString and retainCount вопрос - PullRequest
       2

NSString and retainCount вопрос

0 голосов
/ 12 августа 2010

У меня есть NSString, объявленная в части интерфейса:

@ свойство (неатомное, сохраняется) NSString * filePath;

В viewDidLoad я даю это значение, и когда я пытаюсь вызвать его из одного из моих пользовательских методов, он работает в первый раз, но во втором он падает. На мой взгляд, filePath был автоматически выпущен во время первого вызова.

Я попробовал другой подход, в моем методе я сделал что-то вроде этого:

NSString * path = [[[NSString init] alloc] autorelease]; path = [filePath copy];

и это время, похоже, работает, но при проверке retainCount пути оно постоянно увеличивается. При первом вызове метода retainCount равен 4, а для второго - 2, третий - 3 и т. Д.

Хорошо, я понимаю, что filePath увеличивается из-за [copy], но почему также из-за переменной пути? И почему в первом случае это не сработало?

1 Ответ

0 голосов
/ 12 августа 2010

Вы не показываете весь код, поэтому трудно сказать что-либо убедительное. Тем не менее:

NSString *path = [[[NSString init] alloc] autorelease];
path = [filePath copy];

не имеет смысла: сначала вы выделяете строку NSString, и пусть path указывает на нее. Тогда вы позволите пути указать на что-то еще. Строка NSString не используется (но будет очищена с помощью автоматического выпуска).

Я вижу, что вы получаете доступ к filePath только по его имени, а не через метод получения / установки. Если вы используете self.filePath, например

self.filePath = [NSString stringWithFormat:@"..."]; // or any other string

тогда оператор сохранения / деблокирования корректно обрабатывается установщиком. Чтобы быть точным, разница между filePath = ... и self.filePath = ... заключается в том, что последний будет сохранять объект, который вы назначаете.

Вы действительно не должны смотреть на retainCount для отладки вещей, если вы не очень уверены, что знаете, что происходит под какао-капюшоном.

...