2012-02-26 5 views
0

Я занимаюсь оптимизацией своего приложения и гарантирую правильность управления памятью. Когда я обнаружил, что didUnload/dealloc/willAppear не является надежным для реализации моей очистки памяти, я решил реализовать свой собственный метод, чтобы я мог полностью контролировать это управление памятью.Память не выпущена, хотя я ее явным образом ее освобождаю

Определение моих массивов в заголовочном файле

@property (retain) NSMutableArray *selectedCardIDs; 
@property (retain) NSMutableArray *selectedRowArray; 
@property (retain) NSMutableArray *cardArray; 
@property (retain) NSMutableArray *cardIDArray; 

Здесь метод выпуска:

- (void) willReleaseObjects { 
[self.aCopyOfCardIDArray release]; 
[self.listOfItems release]; 
[self.aCopyListOfItems release]; 
[self.selectedCardIDs release]; 
[self.selectedRowArray release]; 
[self.cardArray release]; 
[self.cardIDArray release]; 

}

Массивы могут получить очень большой (> 1'000 запись каждого) , почему выпуск этих массивов необходим после того, как представление выгружено. Я явно вызывать эту функцию в методе IBAction, такие как:

- (IBAction) stopDictionary:(UIBarButtonItem *) sender { 
[self closeDatabase]; 
[self willReleaseObjects]; 
[self dismissModalViewControllerAnimated:YES]; 

}

Я отлажена код и он фактически выполняет каждый релиз, однако, когда я диагностировать выделение памяти с помощью инструментов, кажется, освобождайте только частичную память, на самом деле почти ничего, потому что потребление памяти, конечно, увеличивается каждый раз, когда я загружаю это представление снова, что совсем не хорошо. Любая идея, почему моя память не выпущена здесь? Благодарю.

ответ

1

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

Вместо этого выпустите переменную экземпляра за ней или установите для свойства значение nil. В любом случае вы достигнете правильного результата. В случае, если у вас есть какие-либо наблюдателей Key/Value на свойствах лучший способ, чтобы установить свойства всухую, которые будут автоматически распространяться значения любых наблюдателей:

- (void) willReleaseObjects { 
    self.aCopyOfCardIDArray = nil; 
    self.listOfItems = nil; 
    ... 
} 
+0

спасибо Клаус, я попробовал, тот же результат. Я добавил определение свойства в свой вопрос, и, как вы видите, я сохраняю все. И, насколько мне известно, все выделенные объекты должны быть выпущены с использованием release. По крайней мере, это то, что я до сих пор читал об управлении памятью. У меня как-то создается впечатление, что содержимое этого объекта viewController не уничтожается после того, как я вернусь к предыдущему виду. – renesteg

+0

Вам может потребоваться проверить любые другие места, к которым вы обращаетесь к этим свойствам, и убедиться, что у вас нет дополнительного места. Также убедитесь, что не просачивайте его при создании свойств. Например. это вызовет утечку: self.property = [[AClass alloc] init]; Во всяком случае, описанный мной метод не вызовет утечек. –

+0

Решено. Забыл авторекламу на alloc. Объекты теперь освобождаются, когда они должны. Но я понял другое странное поведение: когда я начинаю свой основной взгляд, я вижу около 400 объектов, как только отображается представление, счетчик распределения в Инструментах внезапно увеличивается до более чем 6000. Возможно, это будет нормально, поэтому не стоит снова начинать преследовать фантомы, если здесь нечего исправить. Мысли? И есть ли, возможно, тесты для таких вещей? Уолд весьма полезен, чтобы понять, что, поскольку само представление, конечно, также создаст сами объекты. Благодарю. – renesteg