NSArray
không lưu trữ thông tin về các loại đối tượng chứa trong chúng. Nếu bạn biết chắc chắn các loại của các đối tượng trong mảng, bạn có thể thực hiện một dàn diễn viên, hoặc là ngầm hay rõ ràng:
NSString *n = [arr objectAtIndex:1]; // implicit type conversion (coercion) from id to NSString*
NSString *n = (NSString *)[arr objectAtIndex:1]; // explicit cast
Không có sự khác biệt về chi phí thời gian chạy giữa phôi ngầm và rõ ràng, nó chỉ là một vấn đề của phong cách. Nếu bạn nhận được loại sai, sau đó những gì rất có thể sẽ xảy ra là bạn sẽ nhận được sự sợ hãi unrecognized selector sent to instance 0x12345678
ngoại lệ.
Nếu bạn có một mảng không đồng nhất của các loại đối tượng khác nhau, bạn cần phải sử dụng phương pháp isKindOfClass:
để kiểm tra lớp của đối tượng:
id obj = [arr objectAtIndex:1];
if ([obj isKindOfClass:[NSString class] ])
{
// It's an NSString, do something with it...
NSString *str = obj;
...
}
Nguồn
2011-09-03 00:18:03
Cần lưu ý rằng không có cách nào để phân biệt giữa NSStrings và NSMutableStrings khi chạy - tất cả đều trả lời CÓ cho 'isKindOfClass: [NSMutableString class]'. – Chuck
@Chuck: Tôi không biết điều đó. Làm thế nào mà? –
@Chuck: Tôi nhận thấy rằng NSString cũng trả về YES thành '[myNSString respondsToSelector: @" appendFormat:]; '. ISTM mà các chuỗi có thể thay đổi và không thay đổi đều được thực thi bởi __NSCFString và có một số cờ bên trong cho biết nó có thể thay đổi hay không Nếu bạn gọi '[myNSString appendFormat: @" world "];' bạn sẽ nhận được một ngoại lệ, nhưng không phải là một ngoại lệ cho biết nó không đáp ứng với bộ chọn. Rõ ràng 'appendFormat:' kiểm tra cờ bất biến và nếu nó được đặt, nó Một chuỗi có thể thay đổi và không thay đổi được, trên thực tế, cùng một lớp, '__NSCFString'. –