Скорее всего, у вас есть код, который создает объекты фундамента. Утечки показывают вам место выделения, но это обычно происходит из-за вызова, который ваш код сделал для создания объекта. Вы можете посмотреть цепочку вызовов в Instruments и вернуться назад по цепочке вызовов, пока не дойдете до своего кода - это место, где вы вызываете распределение. Теперь, для этого распределения, посмотрите на вашу обработку памяти для этого объекта: вы освобождаете его через некоторое время?
Есть много способов, которыми вы не можете освободить свойство памяти, поэтому было бы трудно догадаться, какой из них вы можете ударить. Я вижу, когда помогаю людям распределить объект и назначить его переменной экземпляра через свойство с атрибутом retain, что-то вроде этого:
@ свойство (сохранить) NSString * myString;
...
self.myString = [[NSString alloc] initWithString: @ "foo"];
alloc + init создает сохраняемый объект, self.myString = снова увеличивает счетчик сохраняемых данных. При правильном кодировании метод dealloc освобождает свойство через одно из:
[выпуск myString];
или же
self.myString = ноль;
И это заботится о сохранении, добавленном с self.myString =, но НЕ заботится о сохранении от создания. Решения, ОДИН из следующих:
myString = [[NSString alloc] initWithString: @ "foo"]; // не вызывает метод setter, поэтому присваивание не сохраняется, но не вызывает setter, что может быть плохо, если нетривиальный setter.
self.myString = [[[NSString alloc] initWithString: @ "foo"] autorelease];
автоматическое освобождение освобождает alloc + init.
Теперь, конечно, это надуманный пример, потому что вы, вероятно, действительно использовали бы:
self.myString = [NSString stringWithString: @ "foo"];
, который является методом класса, возвращающим автоматически освобожденную строку, и позволяет избежать проблемы. Но идея в том, чтобы показать простой пример, объясняющий этот тип проблемы.
Есть много других способов не правильно освободить память, но совет поработать обратно в цепочке вызовов до тех пор, пока вы не доберетесь до своего кода, - это способ посмотреть, где вы запускаете распределение памяти и тогда вы можете понять, почему вы не выпускаете это должным образом.