iphone - UIView.subviews 和 [NSView subviews] 之间的行为差​​异

标签 iphone cocoa macos uiview nsview

我在 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/

相关文章:

ios - ~/Library/Developer/Xcode/iOS DeviceSupport/<iOS Version>/Symbols/System/Library 消耗了 14+GB 的 Mac 磁盘空间

objective-c - 我可以在 NSOutlineViews 中自定义 "Select All"吗?

php - 如何在 Mac 上的不同目录中设置 PHP 的 PATH

iphone - 从 iPhone 移植到 Windows Phone 7

cocoa - 如何从 CoreData-Entities 获取一些值到代码

cocoa - 如何存储(和使用)当前鼠标位置?

macos - 为什么我要使用 NSObjectController?

iphone - 如果用户在 iPhone 和 window.navigator.standalone == true 上,则在 userAgent 时更改 css 显示

ios - map 和 ListView (Yelp 风格)

ios - iPhone中的Facebook SDK错误