iOS OC id类型为什么能指向任意类

·  阅读 1041

###关于id为什么能指向任意的类型

弄懂一点就行了,alloc返回的其实是一个对象的isa地址,也就是说即使两个对象实际分配的结构体内存大小不一样,但是这个结构体的地址都是结构体第一个变量的地址,所以简单来说一个对象的指针,指向的是一个8字节的内存地址,这样子在大小上就不会出现问题 之所以这样子问是因为在c中是错误的,因为指针指向的类型大小不一样,读取指针数据的时候按大小读取就会出错

int *p1;
double x=0;
double *p2 = &x ;
p1=p2;
复制代码

####初步探索 目的:测试c中结构体内存地址

typedef struct test{
    int a;
    int b;
    int c;
    int d;
}test;

 test* t2 = (test*)malloc(sizeof(test));
 t2->a=1000;
 int* t3 = t2;
复制代码

打印出来 t3所指向的值,其实就是1000,从而能够验证结构体内存的地址其实就是第一个变量的地址 如果改成这样:

double* t3 = t2;
复制代码

这样子的话虽然不会报错,但是读取的时候是按double的64位进行数据读取,打印出来不是期望的值 ####结论 从而我们知道了,因为id指向的是一个结构体,这个结构体的第一个变量就是Class isa 那么你赋值任何类型给他其实就只是把isa的地址给了它,所以你其实能发现,这样子也是可行的

UITableView *a=[[UIButton alloc] init];
复制代码

那么我们用 id 类型的好处就是能逻辑上处理泛型,之所以称他为动态类型就是因为在编译的时候,id变量根本不知道自己指向的是哪个类,知道运行的时候,将那个类赋值给了id,它才知道自己是什么类,从而也能看出并不是所谓的强制类型转换。

分类:
iOS
标签:
分类:
iOS
标签: