区块链技术博客
www.b2bchain.cn

iOS 底层原理之对象的本质求职学习资料

本文介绍了iOS 底层原理之对象的本质求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

前言

对象我们几乎每天都在说的词,不管是生活中,还是工作中。生活中你如果没有对象,那么兄弟你得加油了,实在不行我给你new一个。在这愉快的玩笑中我们走入工作中的对象,说到对象不得不提到isa,因为isa告诉我们这个对象是属于谁的。下面就探究下对象的本质以及isa

准备工作

联合体(union)

联合体和结构体类型也是由不同类型的数据组成,下面通过代码探究下联合体

union LWPerson {     int a;      //4     short b;    //2     char c;     //1 };  int main(int argc, char * argv[]) {      @user1 {         union LWPerson    person;         person.a = 8;         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);         person.b = 2;         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);         person.c = 'd';         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);          NSLog(@"%lu---%lu",sizeof(person),sizeof(union LWPerson));      }     return 0; }  2021-06-10 15:50:45.789591+0800 isa探究[78582:10551210] a=8---b=8---c= 2021-06-10 15:50:45.790087+0800 isa探究[78582:10551210] a=2---b=2---c= 2021-06-10 15:50:45.790107+0800 isa探究[78582:10551210] a=100---b=100---c=d 2021-06-10 15:50:45.790125+0800 isa探究[78582:10551210] 4---4

总结:

  • 联合体可以定义多个不同类型的成员,联合体的内存大小由其中最大的成员的大小决定
  • 联合体中修改其中的某个变量会覆盖其他变量的值。
  • 联合体所有的变量公用一块内存,变量之间互斥

联合体优缺点

  • 优点:内存使用更为灵活,节省内存。
  • 缺点:不够包容。

位域(Bit field)

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个只有0和1两种状态成员, 用一位二进位即可,目的是节省存储空间,处理简便。下面通过代码探究位域

struct OldCar {     BOOL front;     BOOL back;     BOOL left;     BOOL right; };  struct NewCar {     BOOL front: 1;     BOOL back : 1;     BOOL left : 1;     BOOL right: 1; };  int main(int argc, char * argv[]) {      @user2 {      struct OldCar oldCar;     struct NewCar newCar;     NSLog(@"----%lu----%lu",sizeof(oldCar),sizeof(newCar));      }     return 0; }  2021-06-10 16:25:04.266985+0800 isa探究[78608:10560097] ----4----1

总结:

oldCar的内存大小是4字节newCar的内存大小是1字节1字节包含8位(bit)newCar中所有变量都是按 位(bit)存在这1字节中,具体的存放格式是从右往左往 0000 1111 依次存放frontbackleftright

对象的本质

探究对象本质之前,先了解编辑器Clang

Clang

  • Clang 是一个C语言、C++、Objective-C语言的轻量级编译器,是由Apple主导编写的
  • Clang 主要用于把源文件编译成底层文件,比如把main.m 文件编译成main.cppmain.o或者可执行文件。便于观察底层的逻辑结构,便于我们探究底层。

Clang 终端编译命令

clang -rewrite-objc main.m -o main.cpp  //UIKit报错 clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk main.m // xcrun命令基于clang基础上进行了封装更好用 //3、模拟器编译  xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp  //4、真机编译 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp 

前言

对象我们几乎每天都在说的词,不管是生活中,还是工作中。生活中你如果没有对象,那么兄弟你得加油了,实在不行我给你new一个。在这愉快的玩笑中我们走入工作中的对象,说到对象不得不提到isa,因为isa告诉我们这个对象是属于谁的。下面就探究下对象的本质以及isa

准备工作

联合体(union)

联合体和结构体类型也是由不同类型的数据组成,下面通过代码探究下联合体

union LWPerson {     int a;      //4     short b;    //2     char c;     //1 };  int main(int argc, char * argv[]) {      @user1 {         union LWPerson    person;         person.a = 8;         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);         person.b = 2;         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);         person.c = 'd';         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);          NSLog(@"%lu---%lu",sizeof(person),sizeof(union LWPerson));      }     return 0; }  2021-06-10 15:50:45.789591+0800 isa探究[78582:10551210] a=8---b=8---c= 2021-06-10 15:50:45.790087+0800 isa探究[78582:10551210] a=2---b=2---c= 2021-06-10 15:50:45.790107+0800 isa探究[78582:10551210] a=100---b=100---c=d 2021-06-10 15:50:45.790125+0800 isa探究[78582:10551210] 4---4

总结:

  • 联合体可以定义多个不同类型的成员,联合体的内存大小由其中最大的成员的大小决定
  • 联合体中修改其中的某个变量会覆盖其他变量的值。
  • 联合体所有的变量公用一块内存,变量之间互斥

联合体优缺点

  • 优点:内存使用更为灵活,节省内存。
  • 缺点:不够包容。

位域(Bit field)

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个只有0和1两种状态成员, 用一位二进位即可,目的是节省存储空间,处理简便。下面通过代码探究位域

struct OldCar {     BOOL front;     BOOL back;     BOOL left;     BOOL right; };  struct NewCar {     BOOL front: 1;     BOOL back : 1;     BOOL left : 1;     BOOL right: 1; };  int main(int argc, char * argv[]) {      @user2 {      struct OldCar oldCar;     struct NewCar newCar;     NSLog(@"----%lu----%lu",sizeof(oldCar),sizeof(newCar));      }     return 0; }  2021-06-10 16:25:04.266985+0800 isa探究[78608:10560097] ----4----1

总结:

oldCar的内存大小是4字节newCar的内存大小是1字节1字节包含8位(bit)newCar中所有变量都是按 位(bit)存在这1字节中,具体的存放格式是从右往左往 0000 1111 依次存放frontbackleftright

对象的本质

探究对象本质之前,先了解编辑器Clang

Clang

  • Clang 是一个C语言、C++、Objective-C语言的轻量级编译器,是由Apple主导编写的
  • Clang 主要用于把源文件编译成底层文件,比如把main.m 文件编译成main.cppmain.o或者可执行文件。便于观察底层的逻辑结构,便于我们探究底层。

Clang 终端编译命令

clang -rewrite-objc main.m -o main.cpp  //UIKit报错 clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk main.m // xcrun命令基于clang基础上进行了封装更好用 //3、模拟器编译  xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp  //4、真机编译 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp 

前言

对象我们几乎每天都在说的词,不管是生活中,还是工作中。生活中你如果没有对象,那么兄弟你得加油了,实在不行我给你new一个。在这愉快的玩笑中我们走入工作中的对象,说到对象不得不提到isa,因为isa告诉我们这个对象是属于谁的。下面就探究下对象的本质以及isa

准备工作

联合体(union)

联合体和结构体类型也是由不同类型的数据组成,下面通过代码探究下联合体

union LWPerson {     int a;      //4     short b;    //2     char c;     //1 };  int main(int argc, char * argv[]) {      @user1 {         union LWPerson    person;         person.a = 8;         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);         person.b = 2;         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);         person.c = 'd';         NSLog(@"a=%d---b=%d---c=%c",person.a,person.b,person.c);          NSLog(@"%lu---%lu",sizeof(person),sizeof(union LWPerson));      }     return 0; }  2021-06-10 15:50:45.789591+0800 isa探究[78582:10551210] a=8---b=8---c= 2021-06-10 15:50:45.790087+0800 isa探究[78582:10551210] a=2---b=2---c= 2021-06-10 15:50:45.790107+0800 isa探究[78582:10551210] a=100---b=100---c=d 2021-06-10 15:50:45.790125+0800 isa探究[78582:10551210] 4---4

总结:

  • 联合体可以定义多个不同类型的成员,联合体的内存大小由其中最大的成员的大小决定
  • 联合体中修改其中的某个变量会覆盖其他变量的值。
  • 联合体所有的变量公用一块内存,变量之间互斥

联合体优缺点

  • 优点:内存使用更为灵活,节省内存。
  • 缺点:不够包容。

位域(Bit field)

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个只有0和1两种状态成员, 用一位二进位即可,目的是节省存储空间,处理简便。下面通过代码探究位域

struct OldCar {     BOOL front;     BOOL back;     BOOL left;     BOOL right; };  struct NewCar {     BOOL front: 1;     BOOL back : 1;     BOOL left : 1;     BOOL right: 1; };  int main(int argc, char * argv[]) {      @user2 {      struct OldCar oldCar;     struct NewCar newCar;     NSLog(@"----%lu----%lu",sizeof(oldCar),sizeof(newCar));      }     return 0; }  2021-06-10 16:25:04.266985+0800 isa探究[78608:10560097] ----4----1

总结:

oldCar的内存大小是4字节newCar的内存大小是1字节1字节包含8位(bit)newCar中所有变量都是按 位(bit)存在这1字节中,具体的存放格式是从右往左往 0000 1111 依次存放frontbackleftright

对象的本质

探究对象本质之前,先了解编辑器Clang

Clang

  • Clang 是一个C语言、C++、Objective-C语言的轻量级编译器,是由Apple主导编写的
  • Clang 主要用于把源文件编译成底层文件,比如把main.m 文件编译成main.cppmain.o或者可执行文件。便于观察底层的逻辑结构,便于我们探究底层。

Clang 终端编译命令

clang -rewrite-objc main.m -o main.cpp  //UIKit报错 clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk main.m // xcrun命令基于clang基础上进行了封装更好用 //3、模拟器编译  xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp  //4、真机编译 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp 

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » iOS 底层原理之对象的本质求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们