copy
возвращает новый объект с сохранением количества 1. Это означает, что вам нужно освободить новый объект, чего вы не делаете.
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
SingPart *theCopy = [sp copy];
[arr addObject:theCopy];
[theCopy release];
}
self.partList = arr;
[arr release];
Даже ваш пользовательский метод copyWithZone:
вставляет объект, но не освобождает его автоматически, что является ожидаемым поведением метода copy
. Копия должна быть сбалансирована так же, как retain или init, то есть вы должны в какой-то момент сбалансировать ее с выпуском.
Наконец, ваш метод initWithSinglePart:
также пропускает imagePath
. В этом случае, если вы объявляете свойство imagePath
как copy
вместо retain
, вам вообще не нужно делать это вручную. Затем вы просто присваиваете значение и позволяете установщику свойств сделать это за вас.
// Header
@property (copy) NSString *imagePath;
// Now this will do the copy for you
self.imagePath = copyFrom.imagePath;