自我总结:
1、前面我们学过了基本的强制类型转换,运算符就是一个圆括号() 如:(type*)variable;
2、这种强制类型转换只是改变了该指针变量的编译时的类型,但该变量所指向对象的实际类型并不会发生任何改变,如果我们不加以判断,转换出来的变量在调用时就会出错。
开始:
下方通过一个程序详细的说明:
//
// main.m
// 指针变量的强制类型转换
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj = @"hello";
//由于obj变量所指向的对象是NSString对象,所以运行时能通过;
NSString *objStr = (NSString *)obj;
NSLog(@"%@",objStr);
//定义一个obj2变量,编译类型为NSObject,实际类型为NSString
NSObject *obj2 = @"hello2";
//尝试将obj2强制转换为NSDate,这行代码没有任何问题
//但程序只是定义一个NSDate类型的指针,该指针与obj2指向同一个对象
NSDate *date = (NSDate *)obj2;
//程序调用date的isEqualToDate方法
//由于date编译时类型是NSDate,因此编译时没有任何问题
//由于date实际指向的对象是NSString,因此程序执行时就会发生报错
NSLog(@"%d",[date isEqualToDate:[NSDate date]]);
// 加上上方这行就会报错
// 2016-02-14 16:09:03.823 指针变量的强制类型转换[3227:1045399] -[__NSCFConstantString isEqualToDate:]: unrecognized selector sent to instance 0x100001090
// 2016-02-14 16:09:03.824 指针变量的强制类型转换[3227:1045399] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString isEqualToDate:]: unrecognized selector sent to instance 0x100001090'
}
return 0;
}