宏定义的常见用法:

定义一段代码,或指定字符串抽成宏。

const(常量):

当有字符串常量的时候,苹果推荐我们使用const,苹果经常把常用的字符串定义成const


宏定义与const的区别:

  • 编译时刻:宏是预编译(编译之前处理),const是编译阶段。

  • 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。

  • 宏的好处:宏能定义一些函数,方法。 const不能。

  • 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。

注意:很多Blog都说使用宏,会消耗很多内存,但是并不会生成很多内存,宏定义的是常量,常量都放在常量区,只会生成一份内存。


const

  • 1.const仅仅用来修饰右边的变量
  • 2.被const修饰的变量是只读的。

const开发中使用场景:

  • 1.当一个方法参数只读
  • 2.定义只读全局变量

很多时候我们在开发中都要static和extern与const联合使用,所以接下来学习一下static和extern和的作用

static作用

  • 修饰局部变量:

1.延长局部变量的生命周期,程序结束才会销毁。

2.局部变量只会生成一份内存,只会初始化一次。

  • 修饰全局变量

1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改。

  声明一个变量,不能定义变量,注意:extern修饰的变量不能初始化

  使用场景,一般用于声明全局变量


static与const联合使用

  • static与const作用:声明一个只读的静态变量
  • 开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合

  

static  NSString * const key = @"name";

所以大家要记住:static和const联合使用的作用:声明一个本文件中静态的全局只读常量

iOS中的static和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量。


extern与const联合使用

开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合。

原因:

  • static与const组合:在每个文件都需要定义一份静态全局变量。
  • extern与const组合:只需要定义一份全局变量,多个文件共享。

全局常量正规写法:开发中便于管理所有的全局变量,通常搞一个全局的文件,里面专门定义全局变量,统一管理。

.m

#import "BaseURL.h"

@implementation BaseURL

NSString *const kName = @"joe";

@end

.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface BaseURL : NSObject UIKIT_EXTERN NSString *const kName; @end NS_ASSUME_NONNULL_END

点开苹果用了UIKIT_EXTERN可以看到:

#ifdef __cplusplus
#define UIKIT_EXTERN extern "C" __attribute__((visibility ("default")))
#else
#define UIKIT_EXTERN extern __attribute__((visibility ("default")))
#endif

然后把extern替换成UIKIT_EXTERN。

这是个习惯问题,也是个态度问题,可能以前只是大概知道这几个关键字的用法,对其理解不深,通过这次可以深刻的理解其用法,并在项目养成良好的编码习惯,点滴积累。

注:在iOS开发中请尽量多使用const、enum来代替宏定义(#define),随着项目工程的逐渐增大,过多的宏定义还可能影响项目的编译速度.

iOS开发之--宏定义与const的区别及使用方法的更多相关文章

  1. iOS开发笔记--宏定义的黑魔法 - 宏菜鸟起飞手册

    宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在 ...

  2. ios开发--常用宏定义(部分转)

    1.release时,屏蔽log #if defined (DEBUG) && DEBUG == 1 #else #define NSLog(...) {}; #endif #if d ...

  3. 李洪强iOS开发之宏定义方法来初始化一个单例对象

    单例的使用: .m 为了方便实用,只要将以下代码定义在header文件或者.pch文件即可: // .h #define singleton_interface(class) + (instancet ...

  4. IOS开发常用宏定义

    //release屏蔽NSLog//放在.pch文件里#ifdef DEBUG #else#define NSLog(...) {};#endif //G.C.D#define BACK(block) ...

  5. IOS开发证书变成“此证书的签发者无效”解决方法

    IOS开发证书全部变成无效,如下图  打包提示错误  解决方法: 1. 下载https://developer.apple.com/certificationauthority/AppleWWDRCA ...

  6. iOS开发之常用第三方框架(下载地址,使用方法,总结)

    iOS开发之常用第三方框架(下载地址,使用方法,总结) 说句实话,自学了这么久iOS,如果说我不知道的但是又基本上都摸遍了iOS相关知识,但是每次做项目的时候,遇到难一点的地方或者没试过的东西就闷了. ...

  7. iOS define 宏定义 和 const定义常量区别

    const   const 是c++中的修饰符.  c++中常用来定义常量,修饰左值. #define 宏定义语句, 在预处理阶段直接做文本替换,不做类型检查. 它们之间的最大区别: 1.  对于co ...

  8. iOS开发——常用宏的定义

    有些时候,我们需要将代码简洁化,这样便于读代码.我们可以将一些不变的东东抽取出来,将变化的东西作为参数.定义为宏,这样在写的时候就简单多了. 下面例举了一些常用的宏定义和大家分享: 1. 判断设备的操 ...

  9. iOS - 常用的宏定义

    1.处理NSLog事件(开发者模式打印,发布者模式不打印) 1 2 3 4 5   #ifdef DEBUG   #define NSLog(FORMAT, ...) fprintf(stderr,& ...

随机推荐

  1. RxJava2 源码解析(二)

    概述 承接上一篇RxJava2 源码解析(一),本系列我们的目的: 知道源头(Observable)是如何将数据发送出去的.    知道终点(Observer)是如何接收到数据的.    何时将源头和 ...

  2. SpringMVC核心分发器DispatcherServlet分析

    本文将分析SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程,让读者了解这个入口Servlet的作用. DispatcherServlet初始化过程 在分析 ...

  3. redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

    windows下安装Redis第一次启动报错: [2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1: ...

  4. windows多线程同步互斥--总结

    我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...

  5. ionic build - 修改gradle路径提升速度和成功率

    ionic build 不成功很多时候是因为下载gradle太慢, 我们可以下载好gradle然后修改配置文件, 从而省去这个烦人的下载过程 1. 下载报错时的gradle zip文件, 或者直接查看 ...

  6. Quality of Service 0, 1 & 2

    来自:http://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels Quality of Servi ...

  7. gcc 头文件依赖关系 分析工具

    http://gernotklingler.com/blog/open-source-tools-examine-and-adjust-include-dependencies/

  8. 在mysql中如何写注释语句

    //在mysql中如何写注释语句 mysql; # 这个注释直到该行结束 mysql; -- 这个注释直到该行结束 mysql ; mysql+ /* 这是一个 多行注释的形式 */ ;

  9. 研究傅里叶变换的一本好书<<快速傅里叶变换及其C程序>>

    快速傅里叶变换及其C程序 <快速傅里叶变换及其C程序>是中国科学技术大学出版社出版的.本书系统地介绍了傅里叶变换的理论和技术,内容包括傅里叶变换(FT)的定义.存在条件及其性质,离散傅里叶 ...

  10. node服务器中打开html文件的两种方法

    方法1:利用 Express 托管静态文件,详情查看这里 方法2:使用fs模块提供的readFile方法打开文件,让其以text/html的形式输出. 代码: var express = requir ...