Вы сталкиваетесь, в основном, с правилами управления памятью Какао (в частности, , эти детали ). Если существует объект с неизменяемой версией и изменяемой версией, то отправка -copy
объекту вернет неизменный объект.
Давайте пройдемся по соответствующей части.
NSMutableArray *localList = [[NSMutableArray alloc] init];
Это создает новый пустой изменяемый массив, которым вы владеете. Хорошо.
self.tableList = [localList copy];
Это создает неизменную копию пустого массива. Кроме того, у вас есть эта недавно созданная копия. Это два объекта, которыми вы владеете в данный момент.
Это также присваивает ваш скопированный объект свойству tableList
. Давайте посмотрим на объявление свойства:
@property (nonatomic, copy, readwrite) NSMutableArray *tableList;
Это свойство объявляется с атрибутом copy
, поэтому, когда ему присваивается новое значение, ему отправляется другой метод -copy
. Однако эта третья копия не принадлежит вам, она принадлежит объекту.
[localList release];
Это освобождает исходный пустой изменяемый массив. Хорошо, но есть еще тот, который вы сделали во второй строке, плавающий вокруг, неизданный. Это утечка памяти.
Если вам действительно нужна изменяемая копия чего-либо, вам нужен метод -mutableCopy
. (Документация по этим методам находится в NSCopying
и NSMutableCopying
.) Однако вы никогда не получите изменяемую версию чего-либо в свойстве с помощью * Атрибут 1038 *, поскольку он будет отправлять -copy
тому, кому он назначен. Ваше свойство должно использовать атрибут retain
вместо атрибута copy
, а код для его инициализации должен выглядеть примерно так:
NSMutableArray *localList = [[NSMutableArray alloc] init];
self.tableList = localList;
[localList release];
Или, более короткая версия:
self.tableList = [NSMutableArray array];
В этой ситуации не нужно ничего копировать, вы просто создаете новый объект.