美文网首页CoderHG.iOS
iOS中const的简单介绍

iOS中const的简单介绍

作者: CoderHG | 来源:发表于2016-10-06 19:15 被阅读151次

简单用法

基本数据类型

const 在基本数据类型中的用法

- (void)baseConst {
    // 这两种情况,是一样的.
    // 只读常量
    int const a = 10;
    const int b = 20;
}

指针类型

指针 的简单用法

- (void)pointer {
    // int类型的变量(整形变量)
    int a = 20;
    // 指针变量:指向int类型的变量的地址,作用是存储地址
    int* p = &a;
    *p = 30;
    NSLog(@"%d", a);
}

const指针 的结合使用

- (void)pointerAndConstSuper {
    int a = 10;
    int b = 20;
    // 这两种情况是一样的,修饰的是具体的值(*p与*p1不可修改,但是p与p1可以修改)
    int const * p = &a;
    const int* p1 = &a;
    NSLog(@"%d, %d", *p, *p1);
    // 可以修改地址
    p = &b;
    p1 = &b;
    NSLog(@"%d, %d", *p, *p1);
    b = 300;
    NSLog(@"%d, %d", *p, *p1);
    // 下面就错了
//    *p = a;
//    *p1 = a;
}

注意下面的用法:

- (void)superPointerAndConstSuper {
    int a = 20;
    int b = 30;
    const int * const p = &a;
//    p = &b; // 错的
//    *p = b; // 也是错的.
}

宏与常量的异同

  • 宏是替换,没有变量的概念.用到就会有多余的内存.编译之前,就有了.
  • 常量是全局的,内存只有一份.

使用场景

方法参数中使用

void pointer (const int* p) {
    // 自己想想看吧
}

静态常量

static NSString* const CoderHG = @"CoderHG";

全局常量

// HGConst.h文件
extern NSString * const HGID;

// HGConst.m文件
NSString * const HGID = @"http://www.520CoderHG.com";

建议

在开发中,不要用宏定义来定义常量.

相关文章

网友评论

  • LD_左岸:// HGConst.h文件
    extern NSString * const HGID;

    // HGConst.m文件
    NSString * const HGID = @"http://www.520CoderHG.com";;

    @"http://www.520CoderHG.com";; 这一串 为嘛不能写成[NSString stringWithFrama:@"%@",@""];
    CoderHG:@左岸__ 把 const 去掉,也是会报编译错误的。我现在猜想,要想彻底的理解这个问题,应该需要理解编译的基本原理以及全局变量的内存分布,加上 OC 的动态性。毕竟全局变量在编译期就已经进内存了。
    LD_左岸:@CoderHG 我觉得 本质还是在定义 全局常量 既然是常量 [NSString stringWithFrama:@"%@",@"http://www.520CoderHG.com";;];这个类型 应该是变量的类型 崩管全局还是局部的 本质是变量
    现在是不是在把一个常量 指向一个变量类型呢
    CoderHG:这个我也理解得不是太透彻、总之定义全局变量时的初始值一定要让编译器在编译时直接解析。比如 nil,NULL是可以的。按照道理来说 [NSString stringWithFrama:@"%@",@"http://www.520CoderHG.com";]; 与 @"http://www.520CoderHG.com";是完全一样, 但是编译器不认识前者,值是认识后者,所以直接报错。编译器能识别后者,也是由于字符串的特殊性。

本文标题:iOS中const的简单介绍

本文链接:https://www.haomeiwen.com/subject/cuneyttx.html