从NSArray访问值

时间:2015-08-29 11:40:56

标签: ios objective-c arrays

对此有很多很多相似的问题,但是我已经尝试了所有可以想到的事情,并试图让我的头发发挥作用!

我有一个数组,它从其他视图控制器向下传递,并深深嵌入我的代码中。我把它读到了我需要使用它的viewcontroller,我可以使用:

打印出来
NSLog(@"array = %@", myarray);

返回:

2015-08-29 12:35:27.330 myapp[2679:234549] array = {
date1 = 2000;
date2 = 2010;
reference = 8;
text = "test 4";
}

所以数组存在很好,我可以很好地访问它。

但我似乎无法做最最简单的事情并使用数组中的这些值!

我尝试过通过以下方式访问第一行:

NSString *row1 = myarray[0];

但这会使应用程序崩溃。

我需要访问此数组中的数据,以便我可以使用值填充表。

有人可以帮忙???

崩溃日志:

  

2015-08-29 12:40:05.738 myapp [2721:236045] - [__ NSCFDictionary objectAtIndexedSubscript:]:无法识别的选择器发送到实例0x7fecd3702500   2015-08-29 12:40:05.742 myapp [2721:236045] ***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFDictionary objectAtIndexedSubscript:]:无法识别的选择器发送到实例0x7fecd3702500'

4 个答案:

答案 0 :(得分:1)

您正在崩溃,因为您正试图从字典中获取索引值。你实际上有一本字典。

尝试

NSString *row1 = myarray[@"date1"];

答案 1 :(得分:1)

正如其他人所说,变量myarray包含一个字典。

完全解释:

在Objective-C中,包含对象的变量实际上包含指向该对象的指针。可以将其视为程序的rolodex中的一个条目。

变量有一个类型,"指向数组"的指针。它指向一个应该一个数组的对象。

但是,它可能存在于编译器中,并且变量指向实际上不是数组的东西。

编辑:

要继续rolodex类比,它就好像你的rolodex中有一个管道工的条目,但电话号码(指针)实际上是屋顶工的电话号码。你打电话给这个号码然后开始询问有关管道的人。屋顶工人不明白你在说什么,然后挂断电话。 (谈话崩溃了。)

电话号码是错误类型的指针。类型管道工的指针实际上指向屋顶工人类的一个实例,所以当你开始向管道工发送水管工消息时会发生不好的事情。

以此代码为例:

- (void) typeCasting;
{

  NSDictionary* aDict = 
  {
    @"key1": @"value1",
    @"key2": @"value2",
  }  // -1-
  NSArray *anArray;

  //The compiler throws an error here.
  anArray1 = aDict;  //-2-

  //The compiler allows this due to typecasting.       
  anArray2 = (NSArray *) aDict;   //-3-

  //This code compiles but crashes at runtime.
  NSString *aString = anArray2[0];  //-4-

  //typecast back to dict
  NSDictionary *anotherDict = (NSDictionary *) anArray2; //-5-
}

在上面标有-1-的行上,我们创建了一个词典。

-2-,我们尝试将字典分配给NSArray*类型的新变量。编译器应该抱怨它。这是编译器阻止的编程错误。

-3-,我们提交相同的错误,但这次我们添加了(NSDictionary*)类型转换,告诉编译器"相信我,我知道我在做什么。 "这使我们稍后为运行时崩溃做好准备。

-4-,我们尝试索引anArray2,但它并不真正包含数组,它包含字典。我们崩溃了。

我的猜测是,在你的代码的某个地方,你有一个像-3-这样的行,你可以将字典转换为数组,然后为你的崩溃做好准备。 正确修复方法是首先不要这样做。但是,你可以"创可贴"事后重新将myarray重新翻译回字典,如上面-5-所示。

答案 2 :(得分:0)

  

您认为的数据是数组。

myarray的数据类型可能是NSArrayNSMutableArray,但分配给它的数据是不是。您可以从日志和例外中轻松看到这一点。日志显示myarray的值为:

{
date1 = 2000;
date2 = 2010;
reference = 8;
text = "test 4";
}

这是一本字典。 异常日志[__NSCFDictionary objectAtIndexedSubscript:]中也指出了相同的内容。它清楚地表明您正在尝试在NSArray类型的对象上调用NSDictionary类的方法。

发生这种情况的原因很简单。在为myarray分配值时,编译器不会给出警告/错误,因为myarray在运行时被赋值,这会导致异常。

<强>解决方案: 你可以做多件事。 2种可能的解决方案是:

  • myarray的数据类型更改为NSDictionary,这样就可以了,并将其用作词典。
  • 找出代码中的位置,即分配给myarray的值。通过在运行时检查数据并在需要时进行转换,确保分配有效数组。最简单但很容易,在将数据分配给allValues时使用myarray。这会将有效数组分配给myarray,您无需触及myarray所有者VC中的任何代码。

答案 3 :(得分:0)

您正在处理NSDictionary而不是NSArray,因此myarray[0]无法正常工作。请改用myarray[@"date1"]myarray[@"reference"],...