【问题标题】:removeAllObjects for NSMutableArray that populates UITableView crashes with ARC使用 ARC 填充 UITableView 的 NSMutableArray 的 removeAllObjects 崩溃
【发布时间】:2012-05-07 02:01:34
【问题描述】:

我有一个属性

@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 而不是在任何对象上调用保留/释放,那会发生什么情况。我的 _timesArray 只包含我从 UIDatePicker 获得的 NSDate 对象。

我的堆栈跟踪如下所示:

我的 insertPill 看起来像:

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

    [self clearView];
}

如果我不删除所有对象,就这样做:

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;

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

【问题讨论】:

  • 你是否覆盖了 timesArray 的设置器?
  • 如果你不调用getter,只做[_timesArray removeAllObjects]会发生什么?
  • @mprivat 不,我不会覆盖 timesArray 的设置器。
  • @Joel 如果我执行 [_timesArray removeAllObjects],我会得到同样的结果。
  • 可能你是从一个 NSArray 开始的。不只是传递和保留它,而是制作一个 mutableCopy

标签: iphone nsmutablearray


【解决方案1】:

您将收到 doesNotRecognizeSelector: 异常。这可能意味着您认为是 NSMutableArray 的对象并不是真正的对象。可能是NSArray。你在哪里分配对象?

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

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

【讨论】:

  • 我 po _timesArray 并得到:(NSMutableArray *) $2 = 0x06a207b0 <__NSArrayI 0x6a207b0>( 2012-05-07 03:36:02 +0000 )。我在 viewDidLoad 中初始化对象。
  • __NSArrayI 似乎是NSArray 的内部类名。如果对象是一个可变数组,它将是__NSArrayM。在某处将_timesArray 设置为非可变数组。查看所有设置_timesArray 的地方。
【解决方案2】:
@property (nonatomic, strong) NSMutableArray *timesArray;
if ([_timesArray count] > 0) 

看来,你是这样合成你的财产的:

@syntesize timesArray = _timesArray;

您正在检查 _timesArray 的计数,但从 timesArray 中删除了对象。我从来没有为我的属性设置新名称,也不确定它是如何工作的,但我不喜欢它。

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2018-08-28
    • 2013-03-15
    相关资源
    最近更新 更多