iOS 中的宏定义,常量,与枚举类型使用

原创 2016年05月30日 14:52:44

开发过程中的经常需要使用一些全局的常量,便于方法之间的参数传递和类型确定等,经常使用到的有宏定义,const常量以及枚举等,我们经常使用宏定义来进行全局常量的定义,但是是不是所有的全局常量宏定义都是最好的选择呢?

宏定义是我们最经常使用的全局常量定义方法,使用非常便捷,在使用过程中需要注意以下事项:

1.宏定义是预编译处理,在程序开始编译之前就已经完成;

2.宏定义只是进行字符替换,并没有优先级限制,比如

#define add(x,y)x + y

在使用时如果使用了add(3,4)*add(3,4),宏定义替换之后的结果是3+4*3+4=19,而不是(3+4)*(3+4) =49,一定要注意!!!

3.宏定义不做类型的语法检查,宏定义中宏的所有参数都是没有类型的,可能会存在重复定义的问题,如果重复定义了相同名称的宏,程序只是会给出警告,而不会影响编译,所以如果你定义了同名称两个宏,而替换方式不一样的话,是很难发现的。

4.宏定义不是变量定义,所以并不分配内存;

5.宏定义只是字符串替换,结尾不需要使用使用分号结束。


const是变量修饰符号,在定义全局变量的时候,应该优先考虑static加上const来替换宏定义常量,原因有以下几点:

1.当项目比较大的时候,过多的宏定义会使项目的编译变得缓慢;

2.const修饰变量在编译期间会进行语法检查,可以防止意外的类型错误,以及重复定义,可以使定义更加安全;

3.const修饰变量时,该变量不允许改变,可以防止常量被意外修改;

4.在需要使用的地方,只需要使用extern关键字扩大变量的作用域,使得变量的访问更加灵活。

对于const的使用,需要注意以下事项:

1.const修饰普通变量,表示该变量为常量,使用过程中不允许修改;

2.const修饰指针类变量;含有地址的变量时,以*分为左右两部分,左侧部分含有const修饰符号时,该地址内容不能改修;右侧部分还有const修饰时,该变量地址不能改变,如果两侧都有const修饰,则内存地址和地址内容都不可变;

3.const可以修饰形参,被修饰的参数在方法内部不能被修改;

4.被const修饰的变量的作用域,可以通过extern进行扩展,不需要进行初始化和分配空间,只是告诉编译起该变量会在其他地方进行定义。


对于互斥(不能同时具有两种状态)表示的多种整型变量,一般推荐使用NS_ENUM来表示,使用很简洁,也很方便。比如文本在竖直方向的对齐状态

typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {

    UIControlContentVerticalAlignmentCenter  = 0,

    UIControlContentVerticalAlignmentTop     = 1,

    UIControlContentVerticalAlignmentBottom  = 2,

    UIControlContentVerticalAlignmentFill    = 3,

};

这种表示的优点是可以将多种实用普通整型数字不易区分的状态,用易于区分的字符串表示,见名知意,不易出错,方便表示。但是这种表示方法的不足之处就是各种状态之间不能并存,但是有些时候我们需要使用多种状态同时存在,比如选择了一个通信录里的联系人需要获取的信息类型

typedef NS_OPTIONS(NSUInteger, APContactField)

{

    APContactFieldFirstName        = 1 << 0,

    APContactFieldLastName         = 1 << 1,

    APContactFieldCompany          = 1 << 2,

    APContactFieldPhones           = 1 << 3,

    APContactFieldEmails           = 1 << 4,

    APContactFieldPhoto            = 1 << 5,

    APContactFieldThumbnail        = 1 << 6,

    APContactFieldPhonesWithLabels = 1 << 7,

    APContactFieldCompositeName    = 1 << 8,

    APContactFieldAddresses        = 1 << 9,

    APContactFieldRecordID         = 1 << 10,

    APContactFieldCreationDate     = 1 << 11,

    APContactFieldModificationDate = 1 << 12,

    APContactFieldMiddleName       = 1 << 13,

    APContactFieldSocialProfiles   = 1 << 14,

    APContactFieldNote             = 1 << 15,

    APContactFieldLinkedRecordIDs  = 1 << 16,

    APContactFieldJobTitle         = 1 << 17,

    APContactFieldWebsites         = 1 << 18,

    APContactFieldBirthday         = 1 << 19,

    APContactFieldSource           = 1 << 20,

    APContactFieldRelatedPersons   = 1 << 21,

    APContactFieldEmailsWithLabels = 1 << 22,

    APContactFieldDefault          = APContactFieldFirstName | APContactFieldLastName |

                                     APContactFieldPhones | APContactFieldRecordID,

    APContactFieldAll              = 0xFFFFFFFF

};

如果你需要同时选定姓名和联系方式,只需要定义 _enums = APContactFieldFirstName|APContactFieldLastName|APContactFieldPhones就可以了,

那么问题来了,对于这种可以同时选择多个属性的枚举类型,如何确定某个枚举值(比如APContactFieldFirstName)是不是包含在选定枚举(比如_enums)中呢?

只需要将(APContactFieldFirstName)&(_enums)运算,如果其值为真,则包含,否则为假。


版权声明:本文为博主原创文章,未经博主允许不得转载。

ios高效开发-正确的使用枚举(Enum)

前言 Enum,也就是枚举,从C语言开始就有了,C++、Java、Objective-C、Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个—规范的定义代码中的状...
  • daleiwang
  • daleiwang
  • 2016年01月25日 17:11
  • 25410

iOS 关于枚举的使用

引言: 枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化. 在代码中使用枚举的目的只有一个,那就是增加代码的可读性. 使用: 枚举...
  • ysy441088327
  • ysy441088327
  • 2012年09月24日 14:15
  • 53445

修饰符enum 枚举

如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。    举个例子来说明一吧,为了让大家更明白一点,比...
  • NigthWish1998
  • NigthWish1998
  • 2016年10月24日 17:38
  • 654

IOS 常用枚举写法

// // ViewController.m // Company_Code_枚举类用法 // // Created by 麦子 on 15/8/17. // Copyright (c) 20...
  • qiuyinthree
  • qiuyinthree
  • 2015年08月17日 22:31
  • 2136

iOS设置NSString的枚举

typedef NS_ENUM(NSInteger, ORDERSTATE) { ORDERSTATE_NoStart = 1, //未开始 ORDERSTAT...
  • u011452278
  • u011452278
  • 2015年10月27日 14:59
  • 5703

工作备忘-ios中oc枚举值与字符串之间的转换

在工作中,枚举类型的使用优势没啥好说的。但经常需要将它与字串进行转换方便显示或其它需求。可惜原生的枚举值只能是int常量,并不支持字符串,我们只能自己对枚举值进行转换,一般有两种方案: 方案1中,多是...
  • jaccty
  • jaccty
  • 2015年10月20日 17:56
  • 3974

枚举和字符串的相互转化

enum DPodRecordType{     un_pay         = 0,     un_ext_pay     = 1,     has_pay        = 2,    ...
  • iOS_Pop
  • iOS_Pop
  • 2015年08月07日 14:39
  • 3960

APAddressBook 框架简介

安装pod ‘APAddressBook’ 使用首先,需要 #import 和 #import 。初始化 APAddressBook 对象:APAddressBook *addressBook = ...
  • kmyhy
  • kmyhy
  • 2016年06月08日 17:55
  • 1540

经验之谈—UIButton传值通过枚举

其实在我们开发中,经常会遇到有些朋友写的代码里面,由很多的数字,如果你突然看到了一堆的1,2,3,4,5,或者switch判断里面,case 1: cae 2: case 3 等等,这些代码往往...
  • yi_zz32
  • yi_zz32
  • 2015年12月22日 12:27
  • 1944

iOS 关于枚举的使用

引言: 枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化. 在代码中使用枚举的目的只有一个,那就是增加代码的可读性. ...
  • hengshujiyi
  • hengshujiyi
  • 2014年11月14日 15:34
  • 1229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 中的宏定义,常量,与枚举类型使用
举报原因:
原因补充:

(最多只允许输入30个字)