写点什么

关于静态类型、动态类型、id、instancetype

作者:NewBoy
  • 2022 年 7 月 06 日
  • 本文字数:1176 字

    阅读完需:约 4 分钟

关于静态类型、动态类型、id、instancetype

静态类型

  • 一个指针变量定义为特定的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,这个变量总是存储特定类的对象,默认情况下所有的数据类型都是静态数据类型


    @interface Person : NSObject    property (nonatomic,strong) NSString *name;    -(void)run;    @end    @implementation Person    -(void)run{        NSLog(@"run");    }    @end    int main(int argc, const char * argv[]) {        Person *p = [[Person alloc]init];        p.name = @"ABC";        [p run];        return 0;    }
复制代码


  • 静态数据类型的特点:

  • 在编译的时候就知道变量的类型


  编译时就知道p是Person类型
复制代码


  1. 知道变量中有哪些属性和方法


    @property (nonatomic,strong) NSString *name;    -(void)run;
复制代码


  1. 在编译的时候就可以访问这些属性和方法


   p.name = @"ABC";    [p run];
复制代码


  1. 并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错


动态类型

  • 指程序直到执行时才确定对象所属的类


    @interface Person : NSObject    @property (nonatomic,strong) NSString *name;    -(void)run;    @end    @implementation Person    -(void)run{        NSLog(@"run");    }    -(void)test{        NSLog(@"test");    }    @end
@interface Student : Person @property (nonatomic,assign) int age; -(void)eat; @end @implementation Student -(void)eat{ NSLog(@"eat"); } @end int main(int argc, const char * argv[]) { id obj1 = [[Person alloc]init]; [obj1 run]; id obj2 = [[Student alloc]init]; [obj2 eat]; return 0; }
复制代码


  • 动态数据类型的特点:


  1. 在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道它的真实类型


    id obj1 = [[Person alloc]init];    id obj2 = [[Student alloc]init];
复制代码

id类型与instancetype

  • id类型

  • id是一种通用的对象类型,它可以指向属于任何类的对象,可理解为万用指针,相当于 C 语言的void*数据类型,id也是一个动态数据类型,可以用来定义变量,作为函数参数,作为函数返回值等等

  • id == NSObject*(万能指针)

  • NSObject* 是一个静态类型

  • 由于动态数据类型可以调用任意方法,所以有可能调用到不属于自己的方法,而编译时又不报错,所以导致运行时错误

  • 使用场景:多态,可以减少代码量,避免调用子类特有的方法需要强制类型转化

  • id 类型不能使用点语法,因为点语法是编译器的特性,而 id 类型是运行时的特性

  • 尽量使用静态类型,静态类型可以更早的发现错误,提高可读性

  • instancetype

  • instancetype在编译时就可以判断对象的真实类型

  • instancetype只能用于返回值

  • 自定义的构造方法,返回值尽量使用instancetype,不要用id

发布于: 刚刚阅读数: 3
用户头像

NewBoy

关注

虽不年少,艳阳高照 2019.04.10 加入

还未添加个人简介

评论

发布
暂无评论
关于静态类型、动态类型、id、instancetype_7月月更_NewBoy_InfoQ写作社区