想要遍历删除NSView 的所有子视图,遇到了异常:
Collection <__NSArrayM: 0x600000c8d350> was mutated while being enumerated.
- (void)viewDidLoad {
[super viewDidLoad];
for (NSInteger i = 0; i< 10; i ++) {
[self.view addSubview:[NSView new]];
}
for (NSView *view in self.view.subviews) {
[view removeFromSuperview];
}
}
分析
(lldb) po self.view.subviews
<__NSArrayM 0x600000c8d350>(
<NSView: 0x101922570>,
<NSView: 0x101922ea0>,
<NSView: 0x101922b50>,
<NSView: 0x101923100>,
<NSView: 0x1019234b0>,
<NSView: 0x10191c360>,
<NSView: 0x101923c00>,
<NSView: 0x101923fb0>,
<NSView: 0x101924360>
)
结论: self.subViews 是一个可变数组,在遍历的时候移除会抛异常。
更改为如下,问题解决
- (void)viewDidLoad {
[super viewDidLoad];
for (NSInteger i = 0; i< 10; i ++) {
[self.view addSubview:[NSView new]];
}
for (NSView *view in self.view.subviews.copy) {
[view removeFromSuperview];
}
// Do any additional setup after loading the view.
}
网友评论