美文网首页
const 常量修饰符

const 常量修饰符

作者: zone1026 | 来源:发表于2019-01-15 14:48 被阅读19次

const 定义一个常量,常类型的变量或对象的值是不能被修改的,类似于只读属性。使用场景介绍:

1、修饰基本数据类型常量

书写格式:const 数据类型 符号常变量 = 数值

 const CGFloat kNormalImgWidth = 20;
2、修饰指针常量,存储的指针可变,存储的值不可变

书写格式:数据类型 *const 指针常量命名 = 数据

 #import <UIKit/UIKit.h>

NSString * const tips = @"111";

@interface ViewController : UIViewController
@end
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    extern NSString *tips;
    NSLog(@"%@",tips); // 输出 111
    tips = @"222";
    NSLog(@"%@",tips);// 输出 222
    return YES;
}
#import "ViewController.h"

@interface ViewController () 
@end

@implementation ViewController
 - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%@",tips); // 输出 111
}
3、修饰常量指针,存储的值可变,存储的指针不可变

书写格式:const 数据类型 *指针常量命名 = 数据,这种使用方式存在隐患,常量的值有可能被修改,如果常量被修改,就违背了我们使用常量的初衷,所以这种方式不推荐使用

 #import <UIKit/UIKit.h>

const NSString * tips = @"111";

@interface ViewController : UIViewController
@end
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    extern NSString *tips;
    NSLog(@"%@",tips); // 输出 111
    tips = @"222";
    NSLog(@"%@",tips);// 输出 222
    return YES;
}
#import "ViewController.h"

@interface ViewController () 
@end

@implementation ViewController
 - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%@",tips); // 输出 222
}

与宏定义的区别

  • #define是代码的替换,用到就会产生内存分配,而const只会用到一处内存。
#define kScreenWidth [UIScreen mainScreen].bounds.size.width

#define 这么写是没问题的,因为宏定义是代码的替代,在编译阶段会逐一替换,但是const这么写就有问题了,比如:

const CGFloat kScreenW = [UIScreen mainScreen].bounds.size.width;

这是就是提示 “Initializer element is not a compile-time constant”,const修饰的变量值是不可变的,相当于readonly

  • #define可以出现相同的命名,const则不可以,Xcode会报错。
const CGFloat normalW = 10.0f;
#define kWXDropClose @"Open1"

@interface AppDelegate : UIResponder <UIApplicationDelegate>
#define kWXDropClose @"Open1"
const CGFloat normalW = 10.0f;

@interface ViewController : UIViewController
提示有重复的命名
  • #define可以是函数,const则不能定义函数

const 作用域说明

1、全局常量:不管定义在任何类文件中,其他类文件都可以访问,并且不用引入类文件,修饰符extern,默认的可以不写

 extern NSString * const tips = @"提示信息";

NSString * const newTips = @"新的提示信息";

2、静态常量:使用时需要引入类文件,并且必须在.h文件中,否则找不到常量的定义,修饰符static

 static NSString * const tips = @"提示信息";

相关文章

  • Objective-C 2.0语言笔记

    1. *Const const修饰符在*后表示EOCCarNameConstant是一个常量,而这个常量是指针,...

  • Dart学习笔记——基础

    1、定义常量 Dart 常量:final 和 const修饰符 const值不变 一开始就得赋值。 final 可...

  • C++的Const修饰符几种用法

    1、const修饰符可以声明常量。 2、const修饰符可以声明指针,当const在(*)号左边,意味着指针指向的...

  • OC-const、static、#define使用

    一、const const修饰符可以修饰指针类型、基本数据类型、设置常量 ,编译检查,比宏更加安全 1.const...

  • const 常量修饰符

    const 定义一个常量,常类型的变量或对象的值是不能被修改的,类似于只读属性。使用场景介绍: 1、修饰基本数据类...

  • C#:const 和 static readonly 区别

    const 用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序 static readon...

  • iOS const的使用

    const修饰符将其后的变量设置为常量,即str1和str2为常量,两者的区别在于,常量指针是否可以指向其他的内存...

  • 1.var/let/const修饰符

    js中的变量修饰符 var -->函数作用域 let -->块作用域 const -->常量不可改,对象不可改,对...

  • 宏与const区别

    const:c语音关键字 是一个修饰符 被const修饰后就意味着"只读"不能被修改 .当用字符串常量时,苹果官方...

  • 5.const与指针

    1.const修饰指针-常量指针 2.const修饰常量-指针常量 3.const修饰指针和常量 代码如下

网友评论

      本文标题:const 常量修饰符

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