##這是一個關於型別轉換的問題。
很多時候我們在獲取網路傳輸過來的資料,還有獲取一個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] ;
} }
這樣的話就不會由於呼叫了沒有的方法而報錯了。 這裡至在說明,在進行型別轉換的時候需要謹慎,最好檢視下手冊,看看是不是支援這樣的轉換。