指针变量的强制类型转化同基本数据类型的强制类型转化相同,都是使用类型转化符圆括号。
强制类型转换只改变编译时类型,但该变量所指的对象的实际类型并不会发生改变,所以强制类型转换时可能会出错。
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject* obj = @"hello";
//强制类型转化成NSString
NSString* str = (NSString*)obj;
NSLog(@"转换后:%@",str);
NSObject* obj2 = @"hello";
//强制类型转化成NSArray
NSArray* arr = (NSArray*)obj2;
//报错,arr实际指向的是NSString对象
NSLog(@"转换后:%@",[arr count] );
}
}
为避免上述错误的产生,在实际开发中,我们建议先判断对象的类型,然后再强制类型转换,判断类型有如下方法:
-(BOOL)isMemberOfClass:(Class)aClass:判断该对象是否是aClass类的实例。
-(BOOL)isKindOfClass:(Class)aClass:判断该对象是否为aClass类或其子类的实例。
+(BOOL)isSubclassOfClass:(Class)aClass:类方法,判断当前类是否为aClass类的子类。
NSObject* obj = @"Hello";
//isKindOfClass
//判断obj是否是NSString类或其子类的实例,输出true
NSLog(@"%d",[obj isKindOfClass:[NSString class]]);
//判断obj是否是NSObject类或其子类的实例,输出true
NSLog(@"%d",[obj isKindOfClass:[NSObject class]]);
//判断obj是否是NSObject类或其子类的实例,输出false
NSLog(@"%d",[obj isKindOfClass:[NSArray class]]);
//判断NSString是否是NSObject类的子类 输出true
NSLog(@"%d",[NSString isSubclassOfClass:[NSObject class]]);