这是一个关于类型转换的问题。
很多时候我们在获取网络传输过来的数据,还有获取一个id类型的数组中元素的时候,通常会进行类型转换,只是有时候类型转换也是会出现问题的。
例子1:
NSString *num = @"1";
long newNum = [num longValue];
NSLog(@"num=: %ld", newnum);
其实这段编译是会报错的但是,有集中情况是可以通过编译的。
例子2:
NSString *num2 = @"22";
NSDictionary *dict = @{@"num2": num2};
long newnum = [[dict objectForKey: @"num2"] longValue];
NSLog(@"num2: %ld", num2);
例子3:
NSString *num3 = @"333";
NSArray *array = @[ num3 ];
long newnum = [array[0] longValue] ;
NSLog(@"num3: %ld", num3);
以上两种情况编译都不会出现问题,但是当运行时就会发生错误,因为NSString类型是没有longValue的方法的,它是NSNumber的方法,同理
usignedLongValue,NSString中也是没有usignedLongValue方法的,所以在进行任何类型的转换之前先确定对象是不是能够调用该方法。
respondsToSelector是很好的保护机制,在不知道数据类型的时候可以使用id 来接收然后通过判断在转换成对应的需要的类型
比如:接着上面array
for (int i = 0;i <array.count;i++){
id objc = array[i];
if ([objc respondsToSelector:@selector(LongValue)]){
long newnum = [objc longValue] ;
}
}
这样的话就不会由于调用了没有的方法而报错了。
这里至在说明,在进行类型转换的时候需要谨慎,最好查看下手册,看看是不是支持这样的转换。