gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:08:13 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com