OC关键字const
发布日期:2021-06-28 21:17:27 浏览次数:2 分类:技术文章

本文共 3144 字,大约阅读时间需要 10 分钟。

常量非常量主要分析点在于堆内存区的读写特性。

底层clang编译器编译机制作用下,不推荐将字符串常量抽像成宏符号。
宏符号 与 字符串常量 比较:

1.编译时刻:宏符号是预编译(正式编译之前先替换处理),const是编译阶段检查。

2.编译阶段检查:宏符号不做检查,不会报宏符号替换的编译错误,只是单纯的替换,const会进行编译检查,会在编译阶段报语法错误。
3.宏好处:某些函数,方法可以通过宏符号替换。 const常量堆内存区不能代替函数、方法。
4.宏坏处:使用大量宏符号,每次都需要大量的预编译时间作重新替换,使得整个编译过程耗时更久。
const介绍:
const关键字仅用于修饰定义声明指令中右边的声明字段名

  • (void)constUsingStyle {

    //字段名称栈器皿持有的堆内存区默认模式可读可写(远程访问读取/远程访问写入修改(二次赋值))
    //基本数据类型字段名直接在栈层级写入修改
    int a = 1;
    a = 20;

    //关键字const用法:1.修饰基本类型字段名称栈器皿(只读/声明时初值) 2.

    // const int b = 20;//只读特性(不支持远程访问写入修改(二次赋值))

    // b = 1;

    //const:修饰*指针变量p,带*的变量,就是指针变量.  //基本数据类型直接声明字段名(普通字段名称)写入内容;  int const b = 20;//只读特性  //基本数据类型补充*指针声明出带有基本数据类型*指针风格的指针型字段名  //备注:基本数据类型直接声明字段名不带*标志(int const b的声明效果和const int b的声明效果一致)  int *p = &a;//*指针型字段名p写入相应数据值的地址(p没有采用const修饰,相应的内存可读可写)  //实例对象类型*指针 声明字段名持有相应的实例对象值  NSString *nameStr = @"12345";//对象类*指针结构特征字段名nameStr持有相应的实例对象值  int c = 10;  p = &c;//*指针型字段名p允许修改地址指向  //*指针型字段名p允许修改所访问的内存空间内的数据值  *p = 30;//p和&c对应同一片内存区(一处修改另一处同样跟着受影响)  [SRSToast toastWithMessage:[NSString stringWithFormat:@"%d",c] displayType:5];  NSMutableArray *listAry = [NSMutableArray arrayWithCapacity:3];  [listAry addObject:@"1"];  [listAry addObject:@"2"];  //对象类型类*指针  声明字段名(赋值表达式指令:左边字段名和右边的表达式(右边字段名)持有绑定同个堆内存区)  NSMutableArray *ltAry = listAry;  NSLog(@"listAry=%@|ltAry=%@",listAry,ltAry);  [ltAry removeObject:@"1"];  NSLog(@"listAry=%@|ltAry=%@",listAry,ltAry);  ltAry = [NSMutableArray arrayWithArray:@[@"3",@"4",@"5",@"6"]];  NSLog(@"listAry=%@|ltAry=%@",listAry,ltAry);  //@"12345"/@"0000"开辟堆内存区  NSString *name1 = @"12345";//赋值同级或子类的实例对象值(多太机制),左边name1字段名和右边表达式隐式名持有同一片堆内存区假设0x6b3f  NSString *name2 = name1;//赋值指令操作后,name2字段名和name1字段名持有同一片堆内存区假设0x6b3f  NSLog(@"name1=%@|name2=%@",name1,name2);  //对象堆内存区的读写:可读:对象字段名堆内存区区域中次级字段内容/对象字段名堆内存区本身整体字段内容读取;可写:对象字段名堆内存区区域中次级字段名内容写入修改(对象堆内存区本身的写入不支持整体,如果对象字段名本身整体构建执行赋值指令效果是该对象字段名重新持有绑定全新的堆内存区)/  name2 = @"0000";//name2字段名绑定全新的堆内存区0x6677  NSLog(@"name1=%@|name2=%@",name1,name2);  name2 = name1;//对象字段名name2本身整体构建执行赋值指令,name2字段名绑定name1字段名的堆内存区(此时name2和name1具有同一片堆内存区0x6b3f)  NSLog(@"name1=%@|name2=%@",name1,name2);  //基本数据类型字段名直接在栈层级写入修改  int num1 = 1;//开辟栈区0x9900,直接栈区写入修改数据内容值1  int num2 = 2;//开辟栈区0x3647,直接栈区写入修改数据内容值2  NSLog(@"num1=%d|num2=%d",num1,num2);  num1 = num2;//将num2对应栈区0x3647内直接数据内容值2的数据信息(副本)值读取出来写入num1对应栈区0x9900内,操作结束后num1对应栈区0x9900内直接存储数据值2,num2对应栈区0x3647内依旧直接存储数据值2  NSLog(@"num1=%d|num2=%d",num1,num2);  num1 = 3;//将基本数据类型数据值3直接栈区写入num1对应栈区0x9900内,操作结束后num1对应栈区0x9900内直接存储数据值3,num2对应栈区0x3647内依旧直接存储数据值2  NSLog(@"num1=%d|num2=%d",num1,num2);  //无论怎么构建执行指令,num1,num2这2个基本数据类型字段名定义声明时拥有着不同的栈区,永远具有不同栈区  int num3 = 5;  const int *p1; //*p1:整体呈现常 量符号特性(只读取 结构值) p1:呈现变 量符号特性(可读可写 结构值)  p1 = &num3;//数据型量符号num3的地址  int num4 = *p1;  int num5 = 7;  p1 = &num5;  int num6 = 9;  int const *p2;//*p2:整体呈现常 量符号特性(只读取 结构值) p2:呈现变 量符号特性(可读可写 结构值)  p2 = &num6;//基本数据类型*指针型字段名p2可写入持有基本数据类型的量符号地址化地址值  int num7 = *p2;  int num8 = 110;  p2 = &num8;  //const直接修饰指针变量p3  int * const p3; // *p3:呈现变 量符号特性(可读可写 结构值) p3:呈现常 量符号特性(只读取 结构值)  const int * const p4; // *p4:呈现常 量符号特性(只读取 结构值) p4:呈现常 量符号特性(只读取 结构值)  int const * const p5; // *p5:呈现常 量符号特性(只读取 结构值) p5:呈现常 量符号特性(只读取 结构值)

}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

转载地址:https://blog.csdn.net/yanhaijunyan/article/details/108561399 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:OC关键字static
下一篇:OC中 关键字extern

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月13日 12时09分01秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章