Objective C NSCFString Утечки с NSMutableArrays - PullRequest
2 голосов
/ 26 августа 2009

Я очищаю свой код в приложении для телефонной книги iPhone, и инструмент «Утечки» в Инструментах сообщает, что я пропускаю объекты NSCFString. Вот образец, по которому я следую:

В моем приложении есть класс Person, в котором есть только локальные члены NSString и связанные свойства для имени, фамилии и т. Д.

Мой контроллер представления имеет свойство NSMutableArray, которое заполняется из базы данных SQLite в событии searchBarSearchButtonClicked. Этот NSMutableArray заполнен объектами Person, которые будут использоваться для заполнения моего элемента управления tableview. Кроме того, если пользователь нажимает на человека в представлении, его объект Person будет передан в подробное представление для просмотра дополнительной информации, а не только имени.

При первом поиске и отображении результатов нет утечек памяти.

Теперь, когда я выполняю свой второй поиск, в идеале я хотел бы очистить NSMutableArray и перезагрузить его с новым набором результатов без утечки памяти. Итак, чтобы сделать это, я вызываю removeAllObjects для моего свойства personList, а затем вызываю базу данных для повторного заполнения personList NSMutableArray, как показано ниже:

[self.personList removeAllObjects];
self.personList = [SearchService GetPersonList:searchText];
[list reloadData];

Вызвав removeAllObject, я избавился от утечек, которые у меня были, которые были связаны с объектами Person. Тем не менее, похоже, что теперь я вытекаю из объектов NSString, оставшихся от свойств отдельных объектов Person.

Возможно ли это?

Я новичок в инструменте Instruments, но из того, что я могу сказать из Расширенной детали, когда углубляюсь в одну из утечек NCSFString, является то, что последняя строка кода в стеке часто указывает на строку кода @synthesize для свойство, такое как:

@synthesize firstName;

Итак, вот почему я думаю, что эти строки NSS не очищаются. Есть ли лучший способ сделать это, что не вызывает утечки памяти?

1 Ответ

3 голосов
/ 26 августа 2009

Выпускаете ли вы NSString s в методе dealloc для вашего класса Person?

Предполагая, что вы настроили свою собственность так:

@property (retain) NSString *firstName;

Когда вы установите firstName с помощью установщика, он будет сохранен. Если экземпляр Person затем освобождается и освобождается, но firstName не был освобожден, он утечет.

Поместите это в метод dealloc в вашем Person классе:

- (void)dealloc
{
    [firstName release];
    [super dealloc];
}

(Предполагается, что соответствующий ivar, используемый для вашего свойства firstName, называется firstName).

...