1

我尝试使用此方法获取所有子视图,但是当我运行应用程序时,我有一条消息发送到 deallocated instance 错误。

subviewsArray = self.view.subviews;
for (int i=0; i <subviewsArray.count; i++) {
    UIView *subview = [subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}

在我的 .h

@property (nonatomic, strong) NSArray *subviewsArray;
4

5 回答 5

6

将您的循环代码更改为:

for (int i=subviewsArray.count - 1; i >= 0; --i) {
    UIView *subview = [subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}

您遇到此问题的原因是,当您的循环从 0 前进到第 10 个(假设是最后一个)视图时,您开始将它们从父视图中删除,因此计数也会发生变化,因此剩余视图的索引也会发生变化。

最后,您最终尝试删除视图并向其发送消息removeFromSuperview,该消息已被释放,这一切都是因为索引的更改。最好反向,最后一个索引到第一个。

我很惊讶,为什么你没有让 index out of bound 异常。

不只是在这里,一般来说,每当您遍历基于索引的集合并尝试删除元素时,您总会遇到这个问题。

于 2012-07-10T13:23:09.817 回答
2

将循环代码更改为如下所示:

subviewsArray = self.view.subviews;
for (int i=0; i <subviewsArray.count - 1; i++) {
    UIView *subview = [subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}
于 2012-07-10T13:15:50.673 回答
1

试试这个:

for(UIView *temp in self.view.subviews )
{
    [temp removeFromSuperview];
}

或这个:

[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

希望这可以帮助。

干杯!

于 2012-07-10T13:14:13.323 回答
1
 self.subviewsArray = self.view.subviews;
for (int i=0; i <self.subviewsArray.count - 1; i++) {
    UIView *subview = [self.subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}
于 2012-07-10T13:14:31.213 回答
1

首先虽然可能是 ARC 造成的,但也许简化 for 循环可以解决这个问题

for (UIView *subview in self.subviews)
{

}   
于 2012-07-10T13:15:45.920 回答