2010-12-13 2 views
1
NSMutableArray *tempData=[[NSMutableArray alloc]init]; 
    TBXMLElement * city = [TBXML childElementNamed:@"city" parentElement:root]; 
    while(city!=nil){ 
     if([TBXML valueOfAttributeNamed:@"name" forElement:city]!=nil){ 
     NSString *tempDataHolder=[NSString stringWithFormat :@"%@,%@",[TBXML valueOfAttributeNamed:@"name" forElement:city],[TBXML valueOfAttributeNamed:@"country_name" forElement:city]]; 
     [tempData addObject:[tempDataHolder copy]];   
     [tempDataHolder release]; 
       } 
city = [TBXML nextSiblingNamed:@"city" searchFromElement:city];   

    } 
    tableData=[tempData copy]; 
    [tableCities reloadData]; 
    [tempData release]; 

Приборы с утечками памяти говорят, что существует утечка нескольких NSCFStrings, я пытался понять это на какое-то время, любая помощь очень ценится.какао; Какая утечка в этом коде?

Благодаря

редактировать: Вышеуказанный набор кода работает в несколько раз, и у меня есть куча утечек, относящихся к NSCFString - NSPlaceholderString. Я выпускаю tempDataHolder почти сразу, а остальные переменные также выпущены. Я не могу сказать, где находится утечка.

ответ

4

Скопированные объекты должны быть освобождены владельцем. То есть, метод copy возвращает новый объект, который имеет сохранить количество, равное 1. В вашей ситуации, преступник, кажется, эта линия:

[tempData addObject:[tempDataHolder copy]]; 

Контейнеры сохраняют свои элементы, но скопированный объект уже имеет сохранить счетчик 1 перед вставкой в ​​массив. Таким образом, скопированный объект протекает.

Просто введите tempDataHolder в свой массив (а не копию), чтобы решить его.

Кроме того, tempDataHolder - объект с автоотделкой и не должен выпускаться явно.

+0

Спасибо Мартин, позвольте мне попробовать этот! – Veeru

+0

Еще раз спасибо Мартин, который позаботился обо всем :) - Это было мое невежество относительно [копии] .. Узнали что-то новое. Голосование и маркировка как ответ :) – Veeru

+0

Рад, что я мог помочь. –

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