【问题标题】:NSArray count not workingNSArray 计数不起作用
【发布时间】:2012-01-03 11:13:53
【问题描述】:

所以我有一个UITableView,我用来自.plist 的数据填充表格视图。这对我来说一直很好,直到今天,当我尝试做同样的事情时,我无法让 numberOfRowsInSection, 方法工作。这是我的代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     if...

     else if (segmentOptions == exchange){
         NSArray *array = [NSArray arrayWithArray:[exchangeDictionary objectForKey:[listOfExchanges objectAtIndex:section]]];
         return [array count];
     }   

   //Else
    return contentArray.count;
}

所以在那个代码中,每次我运行它时,代码都会崩溃。但是,我使用基本相同的代码来设置 tableview 文本并且效果很好:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *CellIdentifier = @"Cell";

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
     }

     if...

     else if (segmentOptions == exchange) {
           NSArray *array = [NSArray arrayWithArray:[exchangeDictionary objectForKey:[listOfExchanges objectAtIndex:indexPath.section]]];
           cell.textLabel.text =  [array objectAtIndex:indexPath.row];
     }

     return cell;
}

而且该代码运行良好,这就是我如此困惑的原因。当我将行数设置为返回特定数字并运行其余代码时,一切正常。所以我真的迷路了。提前致谢

更新 我尝试使用正确的 count 表示法 return [array count];,但仍然遇到相同的崩溃和相同的控制台输出。

【问题讨论】:

  • 当它崩溃时你会得到什么?
  • 为了向您提供解决方案,我们需要查看崩溃报告,或至少查看有关崩溃的更多信息。
  • 这是控制台中唯一出现的内容:warning: Frame pointer point back at the previous frame (gdb) - 但我认为这没有用
  • 引用确切的消息。你怎么知道它“崩溃”了?
  • (我怀疑你的“数组”返回为零。)

标签: iphone ios xcode uitableview tableview


【解决方案1】:

首先,count 不是一个属性,所以你不应该使用点语法来访问它。

我建议更改您的代码,这样您就不会像访问属性那样访问 count 方法。

第二,

测试看看你的数组是否为 nil,甚至是一个数组。

第三,

发布实际的完整堆栈跟踪。

【讨论】:

  • 使用属性表示法访问count 是相当普遍的。它有效,编译器从不抱怨。
  • 这不是“相当常见的......”;这是错误的。这违背了点语法的意图。消除代码中的每个问题有助于缩小问题范围。点语法不应用于非属性。就是这么简单。
  • 从概念上讲,-count 是NSArray 的只读属性,因此您可以争辩说可以使用点语法。 魔鬼的拥护者>
  • @NickForge 不,它不是属性;故事结局。如果人们想这样使用它,他们应该提交一个雷达,以便将计数变成一个属性。
  • 我不确定 Marcus 关于点符号的评论是否与此处相关;这当然不是“错误的”。点表示法和属性是正交概念,虽然它们通常齐头并进,但我认为没有理由不将它们用于早于 @property 的旧 API 中的概念属性。底层实现是不相关的。如果它是一个没有副作用的概念属性,那么如果这是您喜欢的样式(因为它是我的),请随意使用点符号。
【解决方案2】:

如果控制台消息没有帮助,请将其分解并调试。它有时会有所帮助,尤其是在迟到的时候。即

// NSArray *array = [NSArray arrayWithArray:[exchangeDictionary objectForKey:[listOfExchanges objectAtIndex:section]]];

NSLog(@"%d", section);

id objAtIndex = [listOfExchanges objectAtIndex:section];
NSLog(@"%@", listOfExchanges);
NSLog(@"%@", objAtIndex);

id objForKey = [exchangeDictionary objectForKey:objAtIndex];
NSLog(@"%@", exchangeDictionary);
NSLog(@"%@", objForKey);

【讨论】:

  • 感谢您的回答。这是迄今为止最有帮助的。我试过了,一切都正确记录了。所以我尝试了这个:int count = [[exchangeDictionary objectForKey:objForKey] count]; NSLog(@"ct = %i", count); ,我在控制台中得到了ct = 0。这对我来说没有意义,因为数组正在记录属性,所以我知道它不是零,但它返回 0
  • 这让我想起了retain 和release 的日子,想知道如果我试图保留它,它会起作用吗?
  • 如果您使用的是 ARC,请不要这样做!您是否尝试过使用 NSZombieEnabled 和/或 Instruments 调试您的代码?
  • 我只是在开玩笑。哈哈。我知道我不能那样做,我只是开个玩笑。哈哈,但我确实启用了 NSZombieEnabled,但我认为它没有帮助。而且我对乐器并不完全满意。
【解决方案3】:

试试这个:

[array count]

count 不是属性,它是您在数组上运行的方法。

【讨论】:

  • 进行该更改可能会使代码停止崩溃,但不会使其正常工作。
  • 基于此:“当我将行数设置为返回特定数字并运行其余代码时,一切正常。”我假设他的数组不是 nil,因为他的应用程序在他手动输入返回值时工作,唯一的问题是导致应用程序崩溃的计数。
  • 我认为你读得太多了。如果array 不为零,那么array.count 将起作用,因此array 为零似乎是最有可能出现的问题。
  • 我不明白为什么当他手动返回一个值时他的应用程序会工作。如果在对 numberOfRowsInSection 的返回值进行硬编码时在 cellForRowAtIndexPath 中正确读取该数组,则该数组必须包含数据。
  • 点符号和属性是正交的;使用点符号调用像count 这样的方法是完全有效的。这是一个没有副作用的概念属性,[array count] 和 array.count 在功能上是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
相关资源
最近更新 更多