Да, именно так Apple это реализовала. На mac подпредставления возвращают фактический (изменяемый) массив, используемый представлением, поэтому вы не можете использовать быстрое перечисление при добавлении или удалении представлений. Если вы хотите использовать reverseObjectEnumerator, вы можете это сделать. Не используйте обычный перечислитель, потому что он может пропустить подпредставления, когда они перемещаются вверх, чтобы заменить удаленные. Однако в iOS Apple, похоже, осознала эту проблему и исправила ее, вернув копию автоматически. Объявление свойства описывает только то, как оно установлено, но Apple также решила скопировать его для получения.

я есть фрагмент кода в приложении 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 <NSCFArray: 0x1005208a0> was mutated while being enumerated.

В итоге я сделал это так:

NSArray* subViews = [[self subviews] copy];
for( NSView *aView in subViews ) {
    [aView removeFromSuperview];
}
[subViews release];

Все в порядке. Что меня беспокоит, так это то, почему он работает на iPhone?

subviews это свойство copy:

@property(nonatomic,readonly,copy) NSArray *subviews;

Моей первой мыслью было, может быть, получатели @ synthesize возвращают копию, когда указан атрибут copy.Док ясно понимает семантику копирования для сеттеров, но, похоже, не говорит ни о каком способе для геттеров (или, по крайней мере, для меня это не очевидно). И на самом деле, выполняя несколько собственных тестов, это явно не так. Что хорошо, я думаю, что возвращать копию было бы проблематично по нескольким причинам.

Итак, вопрос в том, как работает приведенный выше код на iPhone? NSView явно возвращает указатель на фактический массив подпредставлений, и, возможно, UIView нет. Возможно, это просто деталь реализации UIView, и мне не стоит об этом беспокоиться.

Может ли кто-нибудь предложить какое-либо понимание?

Ответы на вопрос(3)

Ваш ответ на вопрос