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

#define 预处理指令会把碰到的所有 指定名称 一律换位 定义的内容, 这样的话, 假设此指令在某个头文件中, 那么所有引入这个头文件的代码, 都会被替换

解决这个问题, 有一个办法

static const NSString * name = @"name";

请注意,用此方式定义的常量包含类型信息, 器好处是清除地描述了常量的含义,

还要注意常量名称, 常量命名的方法是: 若常量局限于 "编译单元", 也就是实现文件, 即 .m 文件里面, 则在前面加字幕 k. 若常量在类之外可见, 则通常以类名为前缀

定义常量的位置很重要, 我们总习惯在头文件里声明 预处理指令, 这样所有引入这份头文件的其他文件都会出现这个 预处理指令, 就是用static const 定义的常量也不应该出现在头文件中,

正确的做法是, 若不打算公开某个常量, 则应该将其定义在使用该常量的实现文件里面,  在 @implemantation xxxxxxxx 上方写.

而用 static 修饰符则意味着该白能量仅在定义变量的编译单元中可见, 加入声明次变量时不加 static ,此时若是另一个编译单元中也声明了 同名变量, 编辑器就会报错

有时候需要对外公开某个常量, 应该这样来定义

在 头文件中,即 .h 文件

extern NSString*const XXXXXX;

在 实现文件中, 即  .m 文件

NSString *const XXXXXX = @"xxxxxx";

这个常量在头文件中 声明, 且在实现文件中定义,

//这样定义常量要由于使用 #define 预处理指令, 因为编译器会确保常量值不变,

总结 :

不要用预处理指令定义吃那个两, 这样定义出来的常量不包含类型信息, 编译器只是在编译前据此执行查找与替换操作, 即使有人冲洗定义了常量值, 编译器也不会产生警告信息,这将导致应用程序的常量值不一致.

在实现文件中使用 static const 来定义 只在编译单元可见的常量 , 由于此类常量不在全局单元符号表中, 所以无需为其名称加前缀

在头文件中使用 extern 来声明全局变量, 并在相关实现文件中定义其值, 这种常量要出现在全局符号表中, 所以其名称应加区隔, 通常用用户只相关的类名做前缀

2: 用枚举表示状态. 选项. 状态码

例如: enum AAAAAA{

aaaaaa,

bbbbbb,

ccccccc

};

枚举只是一种常量的命名方式, 编辑器回味枚举分配一个独有的编号, 从 0 开始, 每个枚举递增 1,

定义枚举变量的方式

enum  AAAAAA  state = cccccc;

若想每次不同敲入 enum 而只需要写 AAAAAA, 则需要使用 typedef 关键字重新定义枚举类型,如下:

enum AAAAAA{

aaaaaa,

bbbbbb,

ccccccc

};

typedef enum  AAAAAA   AAAAAA;

现在可以使用 AAAAAA  state = cccccc;

// C++11 标准修订了枚举的某些特性, 其中一项改动是 ' : '  , 可以指明用何种 "底层数据类型" 来保存枚举类型的变量

语法是:

enum AAAAAA : NSInteger  {

aaaaaa,

bbbbbb,

cccccc

};

Foundation 框架中定义了一些辅助的宏, 用这些宏来定义枚举类型时, 也可以指定用于保存枚举值的底层数据类型, 这些宏具备向后兼容性, 如果目标平台的编译器支持新标准, 那就使用新式语法, 否则就改用旧时语法,

这些宏是用 #define 预处理指令来定义的, 其中一个用于定义 普通的枚举类型, 另一个用于定义像 UIViewAutoresizing 这种包含一系列选项的枚举类型, 这种用法不常用.

两种用法如下:

typedef NS_ENUM (NSInteger ,AAAAAA){

aaaaaa,

bbbbb,

cccccc

};

typedef NS_OPTIONS(NSUInteger , AAAAAA){

};

最后还有一种枚举的用法, 就是在 switch 语句里, 我们总习惯 在 switch 语句中加上 default 分支, 然而, 若是用枚举来定义状态机, 则最好不要有 default 分支,  这样的话, 如果稍后有增加了一种状态, 那么编译器就会发出警告信息, 提示新加入的状态并未在  switch  分支中处理,  加入写上了 default 分支, 它就会处理这种新状态, 从而导致编译器不发警告信息, 同样, 用 NS_ENUM 定义其他枚举类型时也要注意此问题

总结: 应该用枚举来表示状态机的状态, 传递给方法的选项以及状态码等值, 给这些值起一个简单易懂的名字.

用 NS_ENUM 与 NS_OPTIONS 宏来定义枚举类型, 并指明其底层数据类型, 这样做可以确保枚举使用开发者所选的底层数据类型实现出来的, 而不是采用编译器所选的类型

在处理枚举类型的 switch 语句中不要实现 default 分支, 这样,加入新的枚举值时, 编译器就会提示开发者, switch 语句并未处理所有枚举.

iOS -- Effective Objective-C 阅读笔记 (2)的更多相关文章

  1. iOS Testing with Xcode 阅读笔记

    官方文档直通车 Performance Testing A baseline is a combination of the average time performance in ten runs ...

  2. Effective Java, 3e阅读笔记一

    引言 本书的目标是帮助读者更加有效地使用Java编程语言及其基本类库,适用于任何具有实际Java工作经验的程序员. 本书一共90个条目,12章,每个条目讨论一条规则,这些规则反映了最有经验的优秀程序员 ...

  3. QCon 2015 阅读笔记 - 其他精选主题

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 QCon 2015 阅读笔记 - 其他精选主题 以前分享过两个主题:移动开发 ...

  4. QCon 2015 阅读笔记 - 移动开发最佳实践

    所有ppt下载地址:http://pan.baidu.com/s/1mg9o4TM 下面是移动开发实践部分的阅读笔记. 移动开发网络性能优化实践 - 陈浩然 (携程) 携程是非常标准的移动App架构, ...

  5. SDL源码阅读笔记(1) 基本模块

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 前言 对于大牛来说,写关于阅读源码的文章都会叫源码剖析或者深入浅出啥的,对于我,自己阅读阅读源码,写 ...

  6. 《STL源代码剖析》---stl_deque.h阅读笔记(2)

    看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...

  7. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

  8. [阅读笔记]Software optimization resources

    http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++   7. The efficiency of differe ...

  9. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  10. <<UML大战需求分析>>阅读笔记(2)

    <<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...

随机推荐

  1. (13)UniquePathIII

    一.问题描述 给定一个二维数组. 数组只有一个元素是1,是起点 数组只有一个元素是2,是终点 数组中的0是必须经过的地方 数组中的-1是障碍不可通过 从起始点到终点一共有多少路径? 二.思路 DFS ...

  2. python-文件读写操作

    打开文件: f=open('test.txt',mode='r',encoding='utf-8') 参数1  文件名,若非当前路径,需指出具体路径 参数2   mode:   文件打开模式 r    ...

  3. Coursera, Deep Learning 5, Sequence Models, week2, Natural Language Processing & Word Embeddings

    Word embeding 给word 加feature,用来区分word 之间的不同,或者识别word之间的相似性. 用于学习 Embeding matrix E 的数据集非常大,比如 1B - 1 ...

  4. TensorFlow从入门到理解(三):你的第一个卷积神经网络(CNN)

    运行代码: from __future__ import print_function import tensorflow as tf from tensorflow.examples.tutoria ...

  5. response的字节流和字符流输入的区别和问题--02-response的outputStream输出数据的问题.avi

    02-response的outputStream输出数据的问题.avi; [字节流] 用meta标签 第一段原始代码:写错: 03-response的Writer输出数据的问题.avi;[字符流输出] ...

  6. TMS 控件测试

    //TMS 控件测试nxflpnl1: TNxFlipPanel; 控件 有一个标题的panel 可以随意收展 TNxBusy; 有很均匀分布的四块区域,但是不像 TFlowPanel nxhtmlb ...

  7. 找出程序GasMileage中的哪一行与下列叙述相对应:

    找出程序GasMileage中的哪一行与下列叙述相对应: a.通知程序将使用Scanner类   import java.util.Scannner; b.创建一个Scanner类的对象   Scan ...

  8. python - 文件系统和文件

    文件系统和文件        文件系统是os用于明确磁盘或分区上的文件的方法和数据结构--即在磁盘上组织文件的方法        计算机文件,是存储在某种长期储存设备或临时存储设备中的一段数据流,并且 ...

  9. Django中的信号基础知识

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 1 2 3 4 5 6 7 8 9 10 ...

  10. RabbitMQ channel 参数详解

    1.Channel 1.1 channel.exchangeDeclare(): type:有direct.fanout.topic三种durable:true.false true:服务器重启会保留 ...