我在 iPhone 应用程序中有一段代码,它从 UIView 子类中删除所有 subview 。它看起来像这样:
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 上运行?
subview 是一个复制属性:
@property(nonatomic,readonly,copy) NSArray *subviews;
我的第一个想法是,当指定 copy 属性时,@synthesize 的 getter 可能会返回一个副本。 The doc对于 setter 来说,复制的语义很清楚,但对于 getter 来说,似乎没有说任何一种方式(或者至少对我来说并不明显)。事实上,我自己做了一些测试,显然情况并非如此。这很好,但我认为出于某些原因,归还副本会出现问题。
那么问题来了:上面的代码在iPhone上是如何运行的呢? NSView 显然返回了一个指向实际 subview 数组的指针,也许 UIView 不是。也许这只是 UIView 的一个实现细节,我不应该为此生气。
有人可以提供任何见解吗?
最佳答案
这是 -[NSView subview ]
中的错误。我可以发誓它已针对 Snow Leopard 修复,但现在找不到任何证据。
幸运的是,有一种更简单的方法来删除所有 subview :
[self setSubviews:[NSArray array]];
关于iphone - UIView.subviews 和 [NSView subviews] 之间的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665179/