【发布时间】:2011-01-12 03:49:44
【问题描述】:
我在 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;
我的第一个想法是,当指定了 copy 属性时,@synthesize 的 getter 可能会返回一个副本。 The doc 对 setter 的复制语义很清楚,但似乎没有为 getter 说明任何一种方式(或者至少,这对我来说并不明显)。实际上,我自己做了一些测试,显然情况并非如此。这很好,我认为归还一份副本会有问题,原因有几个。
所以问题是:上面的代码在 iPhone 上是如何工作的? NSView 显然返回了一个指向实际子视图数组的指针,也许 UIView 不是。也许这只是 UIView 的一个实现细节,我不应该为此烦恼。
谁能提供任何见解?
【问题讨论】:
标签: iphone cocoa macos uiview nsview