[__NSSetM objectAtIndex:]:和NSMutableArray之间有什么联系?

时间:2016-02-18 05:51:38

标签: ios objective-c uitableview nsmutablearray nsset

这是我的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];
}

1http://i.stack.imgur.com/ydFGE.png我在这里改变了tableviewarray到达

调试器的新更新enter image description here

更改数组后,将对象enter image description here添加到索引路径

的行的单元格内

2 个答案:

答案 0 :(得分:0)

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

由于你正在创建一个可变数组,但是然后得到一个错误,说你正在访问一个集合,所以下注是你的糟糕风格导致你混淆了一些变量。在某些时候,你为一个名为tableviewarray的东西分配了一个数组。在另一个点上访问一个名为tableviewarray的东西会给你一个集合。这一套并没有出现巧合,奇迹或出于恶意,它就在那里,因为你把它存储在那里。

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

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

答案 1 :(得分:0)

所以看来你正在修改一个旧的应用程序,你甚至没有花时间检查应用程序是否使用自动或手动引用计数,然后再开始攻击它。

你不理解ARC的含义是令人难以置信的,你浪费了我们相当多的时间。

这样的代码:

tableviewarray=[NSMutableArray arrayWithObjects:@"..."];
在ARC和MRR下,

的行为会有很大不同,在使用手动引用计数时会出现各种问题。

这就是我现在愿意说的所有内容。