Это относится только к OSX, так как в iOS сохраняется копия массива
При удалении всех подпредставлений хорошей идеей будет начать удаление в конце массива и продолжать удаление, пока не дойдете до начала. Это можно сделать с помощью двух строк кода:
for (int i=mySuperView.subviews.count-1; i>=0; i--)
[[mySuperView.subviews objectAtIndex:i] removeFromSuperview];
SWIFT 1.2
for var i=mySuperView.subviews.count-1; i>=0; i-- {
mySuperView.subviews[i].removeFromSuperview();
}
или (менее эффективно, но более читабельно)
for subview in mySuperView.subviews.reverse() {
subview.removeFromSuperview()
}
Примечание
Вы должны НЕ удалить подпредставления в обычном порядке, поскольку это может привести к сбою, если экземпляр UIView удаляется до того, как сообщение removeFromSuperview
было отправлено всем объектам массива. (Очевидно, что удаление последнего элемента не приведет к сбою)
Следовательно, код
[[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
следует НЕ использовать.
Цитата из Документация Apple о makeObjectsPerformSelector :
Посылает каждому объекту в массиве сообщение, идентифицированное данным
селектор, начиная с первого объекта и продолжая
массив до последнего объекта.
(что было бы неправильным направлением для этой цели)