Причина, по которой вы получили это предупреждение, заключается в том, что NSMutableDArray
сохраняет любой объект, помещенный в него; аналогично, когда NSMutableArray
освобождается, он также освобождает любой объект, содержащийся в нем. Итак, давайте посмотрим на ваш код.
Эта строка:
Frame *myFrame = [[Frame alloc] init];
создает новый экземпляр Frame
с именем myFrame
. myFrame
имеет счет сохранения 1, потому что вы использовали alloc / init для его создания.
Затем вы передаете это addFrame:
:
[myMDD addFrame:myFrame];
Что, в свою очередь, помещает его в экземпляр NSMutableArray
:
[frameList addObject:inFrame];
В этот момент inFrame
и myFrame
указывают на один и тот же объект. При добавлении в массив значение сохранения этого объекта увеличивается, поэтому теперь оно равно 2.
Позже, обратно в main
, вы выпускаете myMDD
, который выпускает frameList
. Предполагая, что frameList
теперь имеет счет сохранения 0, он освобождается - и, как NSMutableArray
, он освобождает любой содержащийся в нем объект, включая объект, указанный на моем myFrame
.
Так что теперь счетчик хранения myFrame
равен 1 ... поэтому он не освобождается, и у вас есть утечка памяти.
Один из способов решения проблемы с помощью Cocoa-y - авто-релиз myFrame
:
Frame *myFrame = [[[Frame alloc] init] autorelease];
Что означает, что он не протечет. Затем используйте метод -[MDD dealloc]
во втором примере (Edit_001). Вы правы, что вы не должны выпускать inFrame
в вашем addFrame
методе, поскольку вы его не сохраняете.