Diferencia de comportamiento entre UIView.subviews y [NSView subviews]

Tengo un fragmento de código en una aplicación de iPhone, que elimina todas las subvistas de una subclase de UIView. Se parece a esto:

NSArray* subViews = self.subviews;
for( UIView *aView in subViews ) {
    [aView removeFromSuperview];
}

Esto funciona bien De hecho, nunca lo pensé mucho hasta que probé casi lo mismo en una aplicación Mac OS X (de una subclase NSView):

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

Eso no funciona totalmente. Específicamente, en tiempo de ejecución, obtengo esto:

*** Collection <NSCFArray: 0x1005208a0> was mutated while being enumerated.

Terminé haciéndolo así:

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

Esta bien. Sin embargo, lo que me molesta es por qué funciona en el iPhone.

subviews es una propiedad de copia:

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

Mi primer pensamiento fue, tal vez @ sintetizar getters devolver una copia cuando se especifica el atributo de copia.El documento está claro en la semántica de la copia para los setters, pero no parece decir de ninguna manera para los getters (o al menos, no es aparente para mí). Y en realidad, haciendo algunas pruebas por mi cuenta, esto claramente no parece ser el caso. Lo cual es bueno, creo que devolver una copia sería problemático, por algunas razones.

Entonces la pregunta es: ¿cómo funciona el código anterior en el iPhone? NSView claramente está devolviendo un puntero a la matriz real de subvistas, y tal vez UIView no. Quizás es simplemente un detalle de implementación de UIView, y no debería preocuparme por ello.

¿Alguien puede ofrecer alguna idea?

Respuestas a la pregunta(3)

Su respuesta a la pregunta