【问题标题】:Whats link between [__NSSetM objectAtIndex:]: and NSMutableArray?[__NSSetM objectAtIndex:]: 和 NSMutableArray 之间有什么联系?
【发布时间】:2016-02-18 05:51:37
【问题描述】:

这是我的 NSMutableArray:

tableviewarray=[NSMutableArray arrayWithObjects:@"ca1.png", @"ca2.png", @"ca3.png", @"ca4.png", @"ca5.png", @"ca6.png", @"ca7.png", @"ca8.png",@"ca9.png",@"ca10.png",nil];

NSLog(@"loaded into array =%@",tableviewarray);


loaded into array =(
    "ca1.png",
    "ca2.png",
    "ca3.png",
    "ca4.png",
    "ca5.png",
    "ca6.png",
    "ca7.png",
    "ca8.png",
    "ca9.png",
    "ca10.png"
)

我打印了我的数组,所有东西都正确添加了

当我尝试在 tableview 中使用这个数组时,我得到了错误:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"reload+option=%@",tableviewarray);
    TableViewCell *cell;
    cell=[tableView dequeueReusableCellWithIdentifier:@"cell"];
    cell.images.image=[UIImage imageNamed:[NSString stringWithFormat:@"%@",[tableviewarray objectAtIndex:indexPath.row]]];
    return cell;
}

错误:

reload+option={( -[__NSSetM objectAtIndex:]: 无法识别的选择器 发送到实例 0x146c05c0 * 由于未捕获而终止应用程序 异常'NSInvalidArgumentException',原因:'-[__NSSetM objectAtIndex:]: 无法识别的选择器发送到实例 0x146c05c0' * 第一次抛出调用栈:(0x2115c10b 0x20902e17 0x21161925 0x2115f559 0x2108fc08 0xad8eb 0x255da6bd 0x255da7fd 0x255ca031 0x255defcb 0x2538285b 0x25294d13 0x23393f99 0x2338f695 0x2338f529 0x2338ea49 0x2338e6fb 0x23387ebb 0x2111ef59 0x2111d25d 0x2111d68f 0x21070bf9 0x210709e5 0x222bcac9 0x25300ba1 0x9687f 0x20d1f873) libc++abi.dylib:以未捕获的类型异常终止 NSException

NSMutableArray 初始化:

-(void)viewdidload
{
[super viewdidload];
tableviewarray=[[NSMutablearray alloc]init];
}

1:http://i.stack.imgur.com/ydFGE.png这里我把tableviewarray改成了arrimages

调试器的新更新

更改数组后,将 object 添加到内部单元格中,用于索引路径处的行

【问题讨论】:

  • 该消息说tableviewarray 是一个NSMutableSet,而不是一个数组,所以它不理解objectAtIndex;仔细检查您修改tableviewarray的任何地方
  • 只有当方法进入tableviewcellfor row at index path @Paulw11时才会出现这个问题
  • 您在哪里设置阵列?你如何定义这个变量?当你使用这个方法时,它是一个 NSMutableSet
  • 添加这个试试这个 if(!cell) { cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; }
  • 这个程序使用 ARC 吗?如果不是,则该数组可能已被释放,并且恰好在同一位置分配了一个集合。

标签: ios objective-c uitableview nsmutablearray nsset


【解决方案1】:

您正在分配给 tableviewarray。 tableviewarray 不是属性,它是实例变量、局部变量或全局变量。您没有遵循实例变量应以下划线开头的基本准则。

由于您正在创建一个可变数组,但随后收到一条错误消息,指出您正在访问一个集合,因此您的错误风格导致您混淆了一些变量。在某些时候,您将一个数组分配给称为 tableviewarray 的东西。在另一点访问称为 tableviewarray 的东西会给你一个集合。那个集合不是巧合、奇迹或出于恶意,它的存在是因为你将它存储在那里。

查找编译器警告。看看你在哪里使用 NSSet。查看您分配给 tableviewarray 的位置。删除实例变量的声明并使用该属性。

当你调试你的代码时,遵循简单的规则:它会因为犯了一个错误而中断。没有什么神奇的事情发生,这是你的错误,你需要做的就是找到它。搜索和检查 NSSet 和 tableviewarray 的使用应该可以帮助您。

【讨论】:

  • 是的,这是我的错误,只是兄弟,但我没有使用 nsset。
【解决方案2】:

因此,您似乎正在改造一个旧应用程序,而您甚至没有花时间检查该应用程序是使用自动引用计数还是手动引用计数,然后才开始破解它。

您不了解 ARC 的含义这一事实令人难以置信,您浪费了我们大量的时间。

这样的代码:

tableviewarray=[NSMutableArray arrayWithObjects:@"..."];

在 ARC 和 MRR 下的行为会非常不同,并且在使用手动引用计数时会导致各种问题。

这就是我现在想说的全部内容。

【讨论】:

  • 是的,对不起,这是我第一次进行改造,所以我失败了,但是在这里我会从头到尾检查它,你没有浪费时间兄弟,你教我更多:)
猜你喜欢
  • 2011-05-31
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多