前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >静态类型、动态类型、id、instancetype

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

作者头像
xy_ss
发布2023-11-22 08:35:14
1550
发布2023-11-22 08:35:14
举报
文章被收录于专栏:浮躁的喧嚣

静态类型

  • 一个指针变量定义为特定的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,这个变量总是存储特定类的对象,默认情况下所有的数据类型都是静态数据类型
代码语言:javascript
复制
@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;
}

静态数据类型的特点:

  1. 在编译的时候就知道变量的类型
代码语言:javascript
复制
编译时就知道p是Person类型
  1. 知道变量中有哪些属性和方法
代码语言:javascript
复制
@property (nonatomic,strong) NSString *name;
-(void)run;
  1. 在编译的时候就可以访问这些属性和方法
代码语言:javascript
复制
 p.name = @"ABC";
  [p run];
  1. 并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错

error.png

动态类型

  • 指程序直到执行时才确定对象所属的类
代码语言:javascript
复制
@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. 在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道它的真实类型
代码语言:javascript
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 静态类型
  • 动态类型
  • id类型与instancetype
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档