Когда вы копируете NSMutableArray
с использованием метода copy
или синтезированного сеттера, для которого свойство было указано как copy
, вы получаете неизменяемую копию, что означает, что вы по сути делас простым NSArray
. * Существует метод mutableCopy
, который сохранит изменчивость, но я не верю, что есть способ указать это для свойства.
Если вы хотите, чтобы ваш массив был копируемым образом изменен при установке, вам придется написать собственный метод установки и указать этот метод в объявлении свойства.
@property (nonatomic, copy, setter=setBlockViewsByCopying) NSMutableArray * blockViews;
- (void) setBlockViewsByCopying: (NSMutableArray *)newBlockViews {
NSMutableArray * tmp = [newBlockViews mutableCopy];
[blockViews release];
blockViews = tmp;
}
Дополнительное замечание, как @InsertWittyName упомянул в комментарии, ваш код, инициализирующий blockViews
, создаст утечку, потому что у вас есть две заявки на владение созданным массивом - одна для alloc
и один для retain
или copy
, который вы получаете, используя свойство:
self.blockViews = [[NSMutableArray alloc] init];
// ^ One claim ^ Two claims
// Only one release later, when the property is set again!
// LEAK!
Вместо этого вы должны сделать:
self.blockViews = [NSMutableArray array];
// Creates an object you don't own which you then make one claim
// on using the setter
* Хотя, как этокластер классов, вы действительно получаете неуказанный конкретный подкласс.