我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:
这个工作很好。事实上,我从未真正考虑过它,直到我在一个Mac OS X应用程序中尝试了几乎相同的事情(来自NSView子类):
我最终是这样做的:
我的第一个想法是,当指定copy属性时,@synthesize的getter方法是否返回副本。The doc清楚地说明了setter的复制语义,但对于getter没有明确说明(或者至少我没看出来)。实际上,通过自己进行一些测试,显然并不是这种情况。我认为返回副本会有问题,因此这很好。
那么问题来了:上面的代码在iPhone上是如何工作的?NSView 明显返回指向子视图实际数组的指针,而UIView可能不是这样。也许这只是UIView的一个实现细节,我不应该过于担心它。
有人能提供任何见解吗?
我在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的一个实现细节,我不应该过于担心它。
有人能提供任何见解吗?