Objective-C 预处理 static const ext

作者: FaiChou | 来源:发表于2016-05-25 08:40 被阅读1128次

    作者:周辉
    All rights reserved.

    多用类型常量,少用 #define 预处理指令


    const

    const最好理解,修饰的东西不能被修改
    指针类型根据位置的不同可以理解成3种情况:

    1. 常量指针
    // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变。
    NSString *const pt1;
    
    1. 指向常量的指针
    // 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改
    const NSString *pt2;
    
    1. 指向常量的常量指针
    const NSString * const pt3;
    

    extern

    全局变量的定义

    //x .h 声明
    extern const NSString *AA;
    
    //x .m 定义
    const NSString *AA = @"abc";
    
    // 调用
    #import "x.h"
    // 或者再次申明
    extern const NSString *AA;
    

    static

    static 关键字对变量的作用域进行了限制,使得变量仅在源文件内有效。


    static 与 const 结合

    • static与const作用:声明一个只读的静态变量
    • 在一个文件中经常使用的字符串常量,可以使用static与const组合
    • 开发中常用static修饰全局变量,只改变作用域
    • 为什么要改变全局变量作用域?
    • 防止重复声明全局变量
    • 开发中声明的全局变量,有些不希望外界改动,只允许读取
    // 声明一个静态的全局只读常量
    static const int a = 20;
    
    • static和const联合的作用:声明一个静态的全局只读常量
    • iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量
    // 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改
    static NSString * const key = @"name";
    
    // 如果 const修饰 *key1,表示*key1只读,key1还是能改变
    static NSString const *key1 = @"name";
    
    • 如果一个变量既声明为static,又声明为const,那么编译器根本不会创建符号,而是会向#define预处理指令一样,把所有遇到的变量都替换为常值。
    • 用此方法定义的常量带有类型信息。

    一般用法

    // FCAnimatedView.h
    #import <UIKit/UIKit.h>
    
    @interface FCAnimatedView : UIView
    - (void)animate;
    @end
    
    // FCAnimatedView.m
    #import "FCAnimatedView.h"
    
    static const NSTimeInterval kAnimationDuration = 0.3;
    
    @implementation FCAnimatedView
    - (void)animate {
        [UIViewanimateWithDuration:kAnimationDuration
                                   animations:^() {
                                          //  Perform animations
                                   }];
    }
    
    

    相关文章

      网友评论

        本文标题:Objective-C 预处理 static const ext

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