2012-04-25 2 views
0

Я разрабатываю приложение в поиске с использованием базы данных sqlite с использованием ARC.Почему я не могу удалить RemoveAllObjects из NSMutableArray в iOS?

Мне нужно получить данные из базы данных в NSMutableArray, чтобы отображать извлеченные данные, когда textDidChange Событие UISearchBar.

У этого есть много данных из базы данных, когда textDidChange UISearchBar.

После получения большого количества данных из базы данных, я всегда очищался от NSMutableArray со следующими кодами.

[self.myArrayData removeAllObjects]; 

Однако я удаляю все данные из NSMutableArray, выделения памяти все еще встречаются. Не уменьшается.

В следующий раз, когда я набираю текст в UISearchBar, выделения памяти все еще растут. После того, как я набрал 10 или более раз, я получаю предупреждение о памяти из XCodes и из памяти.

Я хочу знать, почему данные из NSMutableArray не ясны, когда я вызвал метод removeAllObjects. Я разрабатываю приложение с помощью ARC. Пожалуйста, помогите мне.

+2

Вам нужно предоставить больше контекста. – mydogisbox

+1

Откуда вы знаете, что память связана с массивом? – bbum

+0

Я использовал для отслеживания с инструментом Инструмент. После того, как я набрал 10 раз, это займет 100 МБ памяти. Я также использовал RemoveAllObject. –

ответ

4

У вас здесь не так много информации, но это может быть не NSMutableArray, поддерживающий данные. SQLite также хранит кэш недавно полученных записей. Вы можете уменьшить/удалить SQLCache, выполнив это после того, как вы открыли базу данных. Установите размер кеша на количество страниц, которые вы хотите использовать в SQLite. По умолчанию 2000. Каждая страница имеет размер 1024 байта.

const char *pragmaSql = "PRAGMA cache_size = 0"; 
    if (sqlite3_exec(database, pragmaSql, NULL, NULL, NULL) != SQLITE_OK) { 
     NSAssert1(0, @"Error: failed to execute pragma statement with message '%s'.", sqlite3_errmsg(database)); 
    } 

EDIT: Технически вы не можете уменьшить кэш ниже 10. Если вы попытаетесь, то программа будет просто установить кэш 10.

+0

Спасибо за ваш полезный ответ. Это исправлено моей проблемой. –

+0

Но после того, как я выполнил поиск в 50 раз, в вашем заявлении произошла ошибка. «Невозможно загрузить базу данных». То есть. XCodes также показывают ошибку в ваших линиях. Что это за ошибка? Как я могу это решить? –

+1

Вы говорите, что произошла ошибка в коде, который я опубликовал только после того, как вы искали 50 раз? Мой код следует запускать только один раз, когда вы открываете базу данных. Это должно произойти только один раз, обычно при запуске приложения. Некоторые люди закрывают/открывают базу данных для очистки кеша, но поскольку вы устанавливаете cache_size в 0, вам не нужно это делать. Вы действительно не должны закрывать/открывать базу данных для каждого поиска. Вместо этого просто держите базу данных открытой. –

1

если после [self.myArrayData removeAllObjects];[self.myArrayData count] == 0 вы можете быть уверены, что ваш массив имеет удалили его объекты и уменьшили их количество на счету ... но если другие объекты все еще владеют ими, они обычно не будут dealloc 'ed ... так что объекты могут быть более-retained и, следовательно, просачиваться или они могут быть просто принадлежащими чему-то другому.

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