Проблема со строкойByAppendingString и сохранением количества - PullRequest
1 голос
/ 20 мая 2011

Мне нужно объединить некоторые строки.

NSString * sportName = [[NSString alloc ]initWithString:@""];
sportName = [sportName stringByAppendingString:[someObject getString]];
// can be more stringByAppendingString
...
[sportName release];

Но что-то странное для меня дает команда «построить и проанализировать»:

в строке:

sportName = [sportName stringByAppendingString:[someObject getString]]; 

ошибка: Метод возвращает объект Objective-C с счетом сохранения +0 (ссылка не принадлежит)

в строке:

[sportName release];

ошибка: Неправильное уменьшение счетчика ссылок объекта, которому на данный момент не принадлежит вызывающая сторона

Я использую его для заполнения моего TableView, и он падает после загрузки: (.

Ответы [ 3 ]

2 голосов
/ 20 мая 2011
NSString * sportName = [[NSString alloc ]initWithString:@""];
sportName = [sportName stringByAppendingString:[someObject getString]];

Во 2-й строке вы получаете новую строку, которая присваивается обратно spotName. Таким образом, выделенная строка в первой строке просочилась. Я не понимаю, почему вам нужно добавить в пустую строку. Добавление к @"" практически не оказывает влияния. И если у вас есть какая-то непустая строка, вы можете создать ее как автоматически выдаваемую строку вместо alloc. Как это:

// create an autoreleased string
NSString * sportName = @"my_string";
// this will return a new string which is also autoreleased
sportName = [sportName stringByAppendingString:[someObject getString]];
// all subsequent call to stringByAppendingString will return autoreleased string
//so no need to release spotName

А если вам нужно сохранить spotName, вы можете сохранить это или использовать свойство.

0 голосов
/ 20 мая 2011

Вы в первую очередь владеете sportName, отправляя alloc (или new, copy, mutableCopy, retain). Теперь у вас есть свежий экземпляр, который вы должны выпустить позже.

stringByAppendingString возвращает автоматически выпущенную строку, которую вы присваиваете sportName. Ссылка потеряна и никогда не может быть выпущена.

Посмотрите на адреса памяти:

NSString *sportName = [[NSString alloc ]initWithString:@"baa"];
NSLog(@"<%p> %@", sportName, sportName);
sportName = [sportName stringByAppendingString:@" foo"];
NSLog(@"<%p> %@", sportName, sportName);

Выход:

2011-05-20 08:19:08.675 foo[1262:207] <0x3038> baa
2011-05-20 08:19:08.677 foo]1262:207] <0x4e40bd0> baa foo

имя спортсмена было перезаписано.

Вы можете исправить это, введя tmp или используя строковый литерал:

NSString *sportName = @"baa";

или

...
NSString *tmp = [sportName stringByAppendingString:@" foo"];
0 голосов
/ 20 мая 2011

хорошо, зачем вам выделять (и таким образом сохранять) вашу строку, если вы используете ее только внутри метода (как кажется) ...

попробуйте это:

NSString * sportName = @"";

вместо вашего "alloc":

и удалите разделительную линию ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...