【问题标题】:NSMutableArray data went nil when UITableView loads当 UITableView 加载时 NSMutableArray 数据为零
【发布时间】:2014-11-12 18:25:07
【问题描述】:

我在将数据从 NSMutableArray 填充到 UITableView 时遇到问题。在ViewDidLoad 中,我进行了一个网络调用,它从 Parse 获取数据并返回一个名为“journalEntries”的NSMutableArray,然后我将此数组中的数据复制到名为“allEntries”的NSMutableArray 变量中。我在这里设置了一个断点并验证了_allEntries 有4 个对象(不是nil)。但是,当涉及到numberOfRowsInSection 方法时,_allEntries.count 返回 4 但我在这里设置了一个断点,_allEntries 中的所有对象都变为nil

- (void)viewDidLoad {
    [super viewDidLoad];

    _allEntries = [[NSMutableArray alloc] init];

    [MMDatabaseHelper getAllJournalEntries:^(NSMutableArray *journalEntries) {

        for (MMJournalEntry *entry in journalEntries)
             [_allEntries addObject:entry];
        // I set a breakpoint here and verified that _allEntries has 4 objects

        [self.tableView reloadData];
    }];

下面这个方法返回 4 但 allEntries 数组中的所有对象都是 nil。在 viewDidLoad 中它们不是 nil。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return _allEntries.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    MMJournalEntry *currentEntry = _allEntries[indexPath.row];

    return cell;
}

编辑1:第一张截图是网络调用完成时。第二个是numberOfRowsInSection方法

编辑 2:这是getAllJournalEntries 方法

+(void) getAllJournalEntries:(void(^)(NSMutableArray *journalEntries))callback {
    PFQuery *query = [PFQuery queryWithClassName:JournalTable];
    [query findObjectsInBackgroundWithBlock:^(NSArray *entries, NSError *error) {
        if(entries != nil && entries.count > 0) {
            NSMutableArray *mainEntries = [[NSMutableArray alloc] init];
            for (PFObject *entry in entries) {
                //convert to journal entry...
                MMJournalEntry *je = [[MMJournalEntry alloc] init];
                je.objId = entry.objectId;
                je.textContent = entry[@"textContent"];
                je.createdByUserId = entry[@"createdByUserId"];
                je.cityStateName = entry[@"cityStateName"];
                je.lattitude = entry[@"lattitude"];
                je.longitude = entry[@"longitude"];
                je.lattitude = entry[@"lattitude"];
                je.tags = [NSMutableArray arrayWithArray:[entry[@"tags"] componentsSeparatedByString:@","]];
                je.numberOfHearts = entry[@"numberOfHearts"];

                [mainEntries addObject:je];
            }
            callback(mainEntries);
        }
        else
            callback(nil);
    }];
}

【问题讨论】:

  • NSArray(或NSMutableArray)的元素不能是nil。如果您将_allEntries 中的“对象”视为nil,则说明您的调试器或您对其输出的解释有问题。
  • _allEntries 的声明在哪里?如果它是 viewController 的 @property,也许可以尝试 self.allEntries 代替?无论如何都不应该直接访问支持的 ivar。此外,例如,如果您尝试访问第 10 行的条目,但只有 5 个条目,则该数组索引没有任何值。确认该条目仍然存在是个好主意。
  • 在 cellForRow... NSLog 你的 _allEntries 对象。它可能为零(将记录为(null))。 NSArray 中有 nil 条目是非法的。
  • getAllJournalEntries: 在哪个队列上调用其完成处理程序?很容易想象reloadData 在后台队列中不起作用。在这种情况下,您对-tableView:numberOfRowsInSection: 被称为 -viewDidLoad 的假设不一定成立。
  • 您能否显示您的MMJournalEntry 对象的定义 - 特别是它的属性声明 - 看起来它们正在被释放

标签: ios uitableview nsmutablearray


【解决方案1】:

当您从 Parse 收到 NSMutableArray 时,为什么不简单地将其复制到 NSArray 上?您应该重新声明您的 allEntries 属性,并且不需要 forin 循环。

_allEntries = journalEntries.copy;

由于NSArray 是不可变的,它永远不会丢失值。

【讨论】:

    【解决方案2】:

    在花了很多时间试图修复这个错误之后,我终于修复了它。感谢 Paulw11 的评论,问题出在MMJournalEntry。此类中的所有属性都被声明为 weak 而不是 strong。我的队友写了这门课,所以我没有检查。谢谢大家。

    【讨论】:

      【解决方案3】:

      如果没有分配的单元格使用@"Cell" 作为标识符。

      方法:

      [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

      将返回nil

      【讨论】:

      • 从 iOS6 开始,您不再需要担心这一点 - 如果不存在单元格,它会为您创建。
      • ...确实这就是dequeueReusableCellWithIndentifier: 的类形式和dequeueReusableCellWithIndentifier:forIndexPath: 的现代形式之间的区别。后者保证它会返回一个单元格(并且可能缓存得更好,因为它有更多信息)。
      • @mc01。好的...我真的不知道...或者journalEntries在调用cellForRowAtIndexPath时被释放?...但我记得NSMutableArray的addObject保留对象。
      猜你喜欢
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多