У меня есть фрагмент кода в приложении для 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 является свойством копии:
@property(nonatomic,readonly,copy) NSArray *subviews;
Моей первой мыслью было, может быть, получатели @ synthesize возвращают копию, когда указан атрибут copy. В документе четко изложена семантика копирования для сеттеров, но, похоже, он не говорит ни о том, ни о другом для получателей (или, по крайней мере, для меня это не очевидно). И на самом деле, выполняя несколько собственных тестов, это явно не так. Это хорошо, я думаю, что возвращать копию было бы проблематично по нескольким причинам.
Итак, вопрос: как работает приведенный выше код на iPhone? NSView явно возвращает указатель на фактический массив подпредставлений, и, возможно, UIView нет. Возможно, это просто деталь реализации UIView, и мне не стоит об этом беспокоиться.
Может кто-нибудь предложить какое-нибудь понимание?