2013-04-09 27 views
0

我有需要一个NSDictionary的方法:通过一个NSDictionary iterrating与子对象

-(id)initWithJSONDictionary:(NSDictionary *)dataDictionary{ 
    self = [super init]; 
    NSLog(@"********************************* %@ ",dataDictionary); 
    for(NSString * key in dataDictionary){ 
     if([key isEqualToString:@"filters"]){ 
      NSDictionary * filtersSubDict = [dataDictionary objectForKey:key]; 
      for(NSString *sfKey in filtersSubDict){ 
       NSLog(@"new filter: %@", sfKey);    
       NSDictionary *filterObject = [filtersSubDict objectForKey:sfKey]; 
       // this line is throwing some kind of thread exception 
      } 
      } 
     } 
     return self; 
} 

任何线索,为什么与评论下它抛出一个异常行: **第一掷调用堆栈:

(0x1d04012 0x1141e7e 0x1d8f4bd 0x1cf3bbc 0x1cf394e 0x1052b 0x137fe 0x259b3 0x4a6853f 0x4a7a014 0x4a6a7d5 0x1caaaf5 0x1ca9f44 0x1ca9e1b 0x1c5e7e3 0x1c5e668 0x85ffc 0x27fd 0x2725) 
libc++abi.dylib: terminate called throwing an exception 
(lldb) 

第一NSLog的显示整个的NSDictionary示出了该:

{ 
    errorCode = 0; 
    filters =  (
       { 
      id = 1001; 
      name = "Base Lenses"; 
      sequence = 1; 
     }, 
       { 
      id = 1002; 
      name = "Standard Anti-Reflective"; 
      sequence = 2; 
     }, 
       { 
      id = 1003; 
      name = "Premium Anti-Reflective"; 
      sequence = 3; 
     }, 
       { 
      id = 1004; 
      name = "Enhanced Scratch Resistance"; 
      sequence = 4; 
     }, 
       { 
      id = 1005; 
      name = Sun; 
      sequence = 5; 
     }, 
       { 
      id = 1006; 
      name = Tint; 
      sequence = 6; 
     }, 
       { 
      id = 1007; 
      name = "Clear To Dark"; 
      sequence = 7; 
     } 
    ); 
    lenses =  { 
     Glass =   (
         { 
       fsv = 1; 
       inStore = 1; 
       lom = 0; 
       price = 465; 
       style = "Glass Std AR"; 
       styleFilters =     (
        1002 
       ); 
       type = "Single Vision"; 
       visionCorrection = singleVision; 
      }, 
         { 
       fsv = 1; 
       inStore = 0; 
       lom = 1; 
       price = 395; 
       style = "Prem Plastic Std AR"; 
       styleFilters =     (
        1002 
       ); 
       type = "SV HD"; 
       visionCorrection = singleVision; 
      } 
     ); 
     "Plastic/Hi-index" =   (
         { 
       fsv = 1; 
       inStore = 1; 
       lom = 0; 
       price = 395; 
       style = "Prem Plastic Std AR"; 
       styleFilters =     (
        1002, 
        1006 
       ); 
       type = "SV HD"; 
       visionCorrection = singleVision; 
      }, 
         { 
       fsv = 1; 
       inStore = 0; 
       lom = 1; 
       price = 465; 
       style = "Glass Std AR"; 
       styleFilters =     (
        1002, 
        1006 
       ); 
       type = "SV HD"; 
       visionCorrection = singleVision; 
      } 
     ); 
     Polycarbonate =   (
         { 
       fsv = 1; 
       inStore = 1; 
       lom = 0; 
       price = 395; 
       style = "FeatherWates Classic"; 
       styleFilters =     (
        1001 
       ); 
       type = "SV Wrap"; 
       visionCorrection = singleVision; 
      }, 
         { 
       fsv = 1; 
       inStore = 0; 
       lom = 1; 
       price = 495; 
       style = "FeatherWates Classic"; 
       styleFilters =     (
        1001 
       ); 
       type = "SV Wrap"; 
       visionCorrection = singleVision; 
      } 
     ); 
    }; 
    materials =  (
     Polycarbonate, 
     "Plastic/Hi-index", 
     Glass 
    ); 
} 

我正在尝试为“过滤器”中的每个节点创建一个新对象,以获取id,名称和序列值

+0

该调用堆栈没有帮助:/请用符号表示它。 – 2013-04-09 17:53:59

+0

尝试进入断点选项卡并打开所有例外的断点。当它抛出你看到的异常时,这将打破调试器。 – thegrinner 2013-04-09 17:54:43

+0

格式化后请查看您的代码。我不应该得到+10吗? – 2013-04-09 18:01:28

回答

4

没有看到您的NSLog声明在说什么或知道您的异常实际上是什么,在你的代码可能抛出异常:

for(NSString *key in dataDictionary) { 

此行可能如果dataDictionary实际上不是一个NSDictionary扔,但被其他一些非<NSFastEnumeration> JSON对象,像一个NSStringNSNumber

if([key isEqualToString:@"filters"]){ 

此行可能会引发如果key并不是真正的NSString,因此没有实现方法-isEqualToString:

 NSDictionary *filtersSubDict = [dataDictionary objectForKey:key]; 

如果dataDictionary是一个快速枚举JSON对象,但并不是真正的NSDictionary这条线可以抛出。 (换句话说,它可能是NSArray,这一行会抛出一个“无法识别选择器”objectForKey:“异常)。

 for (NSString *sfKey in filtersSubDict) { 

和上面一样,这可能抛出,如果filtersSubDict不是NSArrayNSDictionary

  NSLog(@"new filter: %@", sfKey); 
      NSDictionary *filterObject = [filtersSubDict objectForKey:sfKey]; 

这可能抛出,如果filtersSubDict不是NSDictionary而是代替NSArray(同上)。

 } 
    } 
} 

所以,如果它抛出的filterObject = ...线,然后有机会,filtersSubDict实际上不是一个字典,你得到一个无法识别的选择例外。

+1

我喜欢upvoter,他在15秒内阅读完整的答案! – 2013-04-09 18:07:01

相关问题