优(dan)美(teng)的前奏

宏定义这个东东,估计大家在代码中应该天天用吧。

在我刚刚做的一个项目中,各种往代码里码“#define”这种预处理指令。

什么动画时长啊,cell高度啊,cell的个数啊,balabala,看得我这个心烦。

拿一个例子来讲:

A程序猿定义了一个UITableViewCell的高度为45。

#define HEIGHT_TABLEVIEWCELL 45;

B程序猿也定义了一个UITableViewCell的高度为50。

#define HEIGHT_TABLEVIEWCELL 50;

然后B在他写的.m文件中引用了A的文件,然后...然后...就没有然后了。

总结一句话就是,TMD,太乱了。

经过查找资料,发现确实有人提出过问题,并且提出了“少用#define”的建议。

(很明显没有多少人遵循这一建议,大家还在开心的#define)

提出这一观点的论据主要有以下两点:

  (1) 就是像我刚才举的例子一样,如果B引用了A的文件,并且A、B两人的文件中的预定义指令的名字相同,那么就会产生冲突,结果就是A       中的预定义指令把B中的预定义指令代替了。

  (2)没有类型定义,就像#define HEIGHT_TABLEVIEWCELL 45;这句代码中,我们只能从后边的45来推测是int类型或者float类型。但是具体      是哪一种,代码中并不能体现出来。

所以基于以上两点,我们应该尽量少的使用#define这种预定义指令。

那不使用#define,我们使啥捏?

这个问题问滴有水平!^^!

那就分为两种情况跟大家聊聊:

在一个“编译单元”中使用

在Objective-C的语境下,“编译单元”一词通常指每个类的实现文件(以.m为后缀名)。

也就是说,我们只在当前这一个.m文件中使用。

简单使用

这种情况我们就可以使用static和const来修饰变量,例如 static const NSString *kClassName = @"DemoClass";

  • static 能够限制当前变量只能在此编译单元中使用。
  • const 能够限制当前变量只要被定义之后就不能被修改。

参考以下代码:

// DemoViewController.h
#import <UIKit/UIKit.h>
@interface DemoViewController : UIViewController
@end  // DemoViewController.m
#import "DemoViewController.h"  static const NSString *kClassName = @"DemoViewController";  @implementation DemoViewController
@end 

命名规则

根据苹果官方代码我们可以发现,定义“编译单元”内的常量都是以"k",作为前缀。

在多个“编译单元”中使用

简单使用

若要在多个“编译单元”中使用,此类常量需放在“全局符号表”(global symbol table)中,以便可以在定义该常量的编译单元之外使用。

步骤稍微复杂一下,但是比把大象装冰箱要简单一点:

  • 在.h文件中,使用extern、const关键字对变量进行声明。
  • 在.m文件中,对.h文件中声明的变量进行定义。

参考以下代码:

// DemoViewController.h
#import <Foundation/Foundation.h> extern NSString *const DemoViewControllerClassName;  @interface DemoViewController : UIViewController
@end  // DemoViewController.m
#import "DemoViewController.h"  NSString *const DemoViewControllerClassName =  @"DemoViewController";  @implementation DemoViewController
@end 

注意const关键字的位置。

命名规则

为避免名称冲突,最好是用与之相关的类名做前缀。

系统框架中一般都这样做。例如UIKit就按照这种方式来声明用作通知名称的全局常量。

其中有类似UIApplicationDidEnterBackgroundNotification与UIApplicationWillEnterForegroundNotification这样的常量名。

总之,经过这个项目蛋疼的经历,大家还是在项目中尽量少的使用预定义指令。

另外附上咱家的微信公众号的二维码,没事儿可以扫扫哈。

有啥事儿大家可以随时留言交流。

转载于:https://www.cnblogs.com/studylifezy/p/3665041.html

Obective-C之宏定义相关推荐

  1. C++ #define(宏定义)的使用

    C++ 宏定义 #define命令是C++语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. 宏定义的一般形式 #define <宏名& ...

  2. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  3. c 宏定义用法#define

    转自:https://blog.csdn.net/boring_wednesday/article/details/78756696 宏定义 语法     #define name Stuff #de ...

  4. C语言宏定义使用技巧

    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用得宏定义...... 1,防止一个头文件被重复包含 #ifndef COMDEF_H ...

  5. 【C语言】07-预处理指令;-宏定义

    预处理指令简介; 1,C在对源程序进行编译之前,会对一些特殊的预处理指令作解释,产生一个新的源程序,此过程叫做编译预处理.C在经过编译预处理之后才对新的源码进行通常的编译; 2,预处理以'#'开头,且 ...

  6. 巧用宏定义进行调试 (转)

    巧用宏定义进行调试 在进行程序设计时,有时我们往往不希望借住于调试工具(如:gdb, vc),而以输出调试信息的方式进行调试时,我们就可以借住于强大的宏定义来进行调试.    一.在GCC下的定义方法 ...

  7. python用海伦公式求面积_用带参数的宏定义,通过海伦公式求三角形的面积

    要求: 海伦公式: ,其中 ,a,b,c为三角形的三个边.定义两个带参数的宏,一个用来求p,另一个用来求s 题目分析: 首先,题目要求是通过输入三角形的三条边,输出三角形的面积.因为不是任意的三条边都 ...

  8. iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)

    一直以来用宏定义#define也就是定义一些简单的常量,至多也就是定义一个函数,很少关注宏定义的用法.直到看到这样的代码: [cpp] view plaincopy #define PLAYSOUND ...

  9. IOS,十六进制颜色和RGB颜色的宏定义

    2019独角兽企业重金招聘Python工程师标准>>> 16进制颜色值宏定义. //调用NSString *str = model.Color; NSString *strColor ...

  10. 关于函数式宏定义的学习

    题记:回头看看原本学过的知识,发现那些原本以为理解了的皮毛都突然让自己变得陌生.逐步学习,不懈努力. 测试题目时发现得出的结论与自己给出的不同,于是查阅资料,重新学习宏定义相关的文章.在C与C++编程 ...

最新文章

  1. calcite mysql_Apache顶级项目 Calcite使用介绍
  2. [C#]我自己写的一个对字节中每位进行修改值的函数
  3. c语言中的指针语法,C语言中指针的用法介绍
  4. .NET中的设计模式---由吃龙虾想到的
  5. 01-09 Linux三剑客-sed
  6. 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis...
  7. Q117:PBRT-V3反射模型(Reflection Models)笔记
  8. Lua IDE工具-Intellij IDEA+lua插件配置教程(Chianr出品)
  9. robotframework 新建UI自动化测试用例实例一(2)
  10. 【ARM-Linux开发】Ubuntu下的/usr目录权限,导致不能使用sudo命令的修复
  11. Unity3D一个全面整合的专业游戏引擎
  12. 社会工程学利用的人性_社会工程学利用的人性弱点包括
  13. 音频-什么是PCM编码格式?
  14. [每日一氵] openCV drawMatches 函数中 flag 用法
  15. 纯css画三角形/梯形(兼容ie6)
  16. Scratch角色的绘制与中心点
  17. 央视《每周质量报告》:揭秘假宽带真相
  18. [Aizu]-0558 Cheese [BFS]
  19. pAdTy_3 构建地理位置和地图的应用程序
  20. c 语言形式参数,高级语言C的形式参数.doc

热门文章

  1. java lock unlock_【Java并发007】原理层面:ReentrantLock中lock()、unlock()全解析
  2. SpringMVC控制器单例和多例
  3. 一图看懂编程语言迁移模式:终点站是Python、Go、JS
  4. 【Atcoder agc020 C】Median Sum,序列子集和中位数,bitset,01背包
  5. oracle数据库基础测试,ORACLE数据库基础测试题oracle数据库复习题.docx
  6. 学委作业管理系统c语言,c语言大作业-学生信息管理系统.doc
  7. authorization 传 就跨域_跨域访问接口上传图片出现options请求问题解决方法
  8. php写 被转移,php从windows往linux迁移注意事项
  9. 去除内联元素之间的间距
  10. java jython_将对象从Java传递到Jython时保留Java类型