用于NSMutableArray的removeAllObjects用ARC填充UITableView崩溃

时间:2012-05-07 02:01:34

标签: iphone nsmutablearray

我有

的财产
@property (nonatomic, strong) NSMutableArray *timesArray;

它用于填充我的UITableView中的数据。当我想清除我的观点时,我会这样做:

- (void)clearView {
    self.nameField.text = @"";
    self.noteField.text = @"";
    if ([_timesArray count] > 0) {
        [self.timesArray removeAllObjects];
        [self.customTableView reloadData];
    }
}

removeAllObjects导致崩溃。我不知道为什么。我环顾四周,很多帖子都谈到一个被过度释放的物体。如果我使用ARC而不是在任何对象上调用retain / release,那会怎么样?我的_timesArray只保存了我从UIDatePicker获得的NSDate对象。

我的堆栈跟踪如下所示:

enter image description here

我的insertPill看起来像:

- (void)insertPill:(id)sender {
    //[[NSNotificationCenter defaultCenter] postNotificationName:InsertPillNotification object:self];

    [self clearView];
}

如果我不删除AllObjects,只需执行:

NSMutableArray *emptyArray = [[NSMutableArray alloc] initWithCapacity:0];
self.timesArray = emptyArray;

这很有效。但我仍然想知道为什么通过删除它不起作用的对象。

编辑:我在viewDidLoad中初始化数组:

_timesArray = [[NSMutableArray alloc] initWithCapacity:0];

当我想向数组添加新对象时,我这样做:

NSMutableArray *tempUnsortedArray = [[NSMutableArray alloc] initWithArray:_timesArray];        
        [tempUnsortedArray addObject:_datePicker.date];
        self.timesArray = tempUnsortedArray;

我不确定我添加数据的方式是否导致问题。

2 个答案:

答案 0 :(得分:1)

您收到doesNotRecognizeSelector:个例外。这可能意味着您认为NSMutableArray的对象不是真正的对象。它可能是NSArray。你在哪里分配对象?

要开始调试问题,请在调用po之前removeAllObjects对象。报告的是什么类型的物体?

否则NSObject中可能存在非timesArray元素。

答案 1 :(得分:0)

@property (nonatomic, strong) NSMutableArray *timesArray;
if ([_timesArray count] > 0) 

看来,你将这样的房产同义化:

@syntesize timesArray = _timesArray;

您查找_timesArray的计数,但从timesArray删除对象。我从未为我的房产设置新名称,也不确定它是如何工作的,但我不喜欢它。