【Object-C】指针变量强制类型转换

除了id类型外,指针变量只能调用它编译时类型的方法。而不能调用它运行时类型的方法,即使它实际所指向的对象包含该方法。如果需要让这个指针变量调用运行时类型的方法,就需要强制类型转换。
#import 
int  main( int  argc,  const  char  * argv[]) {
   
  @autoreleasepool  {
       
  // insert code here...
       
  NSLog ( @"Hello, World!" );
     
       
  NSObject * obj =  @"Hello" ;
       
  //  由于 obj 变量所指向的对象是 NSString 对象,所以运行时也可通过
       
  NSString * objStr = ( NSString *)obj;
       
  NSLog ( @"%@"  , objStr);
       
  //  定义一个 obj2 变量,编译类型为 NSObject ,实际类型为 NSString
       
  NSObject * obj2 =  @"iOS" ;
       
  //  尝试将 obj2 强转为 NSDate ,这行代码没有任何问题
       
  //  但程序只是定义一个 NSDate 类型的指针,该指针与 obj2 指向同一个对象
       
  NSDate * date = ( NSDate *)obj2;
       
  //  程序调用 date isEqualToDate: 方法。
        // 由于date的编译时类型是NSDate,因此编译时没有任何问题
        // 由于date实际指向的对象是NSString,因此程序执行时就会引发错误(可以自行测试下一行代码)
        // NSLog(@"%d" , [date isEqualToDate:[NSDate date]]);
       
    }
   
  return  0 ;
}
==>>
2014-11-29 15:22:17.215  强制类型转换 [1113:303] Hello, World!
2014-11-29 15:22:17.217 强制类型转换[1113:303] Hello

出现以下错误:
-[__NSCFConstantString isEqualToDate:]: unrecognized selector sent to instance 0x100001090
2014-11-29 15:25:26.893 强制类型转换[1125:303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString isEqualToDate:]: unrecognized selector sent to instance 0x100001090'


转载于:https://www.cnblogs.com/shujucn/p/7481469.html

你可能感兴趣的:(【Object-C】指针变量强制类型转换)