Разница в поведении между UIView.subviews и [NSView subviews]

У меня есть фрагмент кода в приложении для 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, и мне не стоит волноваться по этому поводу.

Кто-нибудь может предложить какую-нибудь информацию?

6
задан zpasternack 12 January 2011 в 03:49
поделиться