У меня есть фрагмент кода в приложении для iPhone, который удаляет все подпредставления из подкласса UIView. Выглядит это так:
NSArray* subViews = self.subviews;
for( UIView *aView in subViews ) {
[aView removeFromSuperview];
}
Это нормально работает. Фактически, я никогда особо не задумывался об этом, пока не попробовал почти то же самое в приложении Mac OS X (из подкласса NSView):
NSArray* subViews = [self subviews];
for( NSView *aView in subViews ) {
[aView removeFromSuperview];
}
Это совершенно не работает. В частности, во время выполнения я получаю следующее:
*** Collection was mutated while being enumerated.
В итоге я сделал это так:
NSArray* subViews = [[self subviews] copy];
for( NSView *aView in subViews ) {
[aView removeFromSuperview];
}
[subViews release];
Это нормально. Но что меня беспокоит, так это почему это работает на iPhone?
subviews - это свойство копирования:
@property(nonatomic,readonly,copy) NSArray *subviews;
Моя первая мысль была, может быть, геттеры @ synthesize будут возвращать копию, когда указан атрибут копирования. Документ разъясняет семантику копирования для сеттеров, но, похоже, не говорит ни о каком пути для геттеров (или, по крайней мере, для меня это не очевидно). На самом деле, проведя несколько собственных тестов, очевидно, что это не так. Что хорошо, я думаю, что вернуть копию было бы проблематично по нескольким причинам.
Итак, вопрос: как приведенный выше код работает на iPhone? NSView явно возвращает указатель на фактический массив подпредставлений, а, возможно, UIView - нет. Возможно, это просто деталь реализации UIView, и мне не стоит волноваться по этому поводу.
Кто-нибудь может предложить какую-нибудь информацию?