编写高质量iOS的52个有效方法学习笔记(1-5)

1.了解Objective-c 语言的起源

Objective-c与C++、Java等面向对象语言类似,不过很多方面有所差别。

Objective-c Java等其他对象语言
消息结构 函数调用
其运行时所应执行的代码由 运行环境来决定 编译器决定
  • Objective-c为C语言添加了面向对象特性,是其超集。Objective-c使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收一条消息后,究竟应执行何种代码,由运行环境而非编辑器决定。
  • 理解C语言的内存模型和指针有利于学号Objective-c

2.在类的头文件中尽量少的引用其他头文件

将引入头文件的时机尽量延后,只在确有需要时才引入,这样就可以减少类的使用者所徐引入的头文件数量。(尽量别在.h文件中引入其他头文件,一方面为了减少编译时间,使用@class xxx,另一方面防止两个类互相引用)

3.多用字面量语法,少用与之等价的方法

字面量也叫语法糖,好处在于缩减源代码长度,精简,易读。

    NSNumber *someNum = [NSNumber numberWithInt:1];
    NSNumber *somenum = @1;

    NSArray *arr = [NSArray arrayWithObjects:@"1",@"2", nil];
    NSArray *arr0 = @[@"1",@"2"];
    NSString *str = [arr objectAtIndex:1];
    NSString *str0 = arr0[1];

    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
    NSDictionary *dic0 = @{@"key0":@"value0",@"key1":@"value1"};
    NSString *dicStr = [dic objectForKey:@"key0"];
    NSString *dicStr0 = dic[@"key0"];

 * 对于数组,如果值中有nil,会有以下情况
    NSString *obj0 = @"0";
    NSString *obj1 = nil;
    NSString *obj2 = @"2";
    NSArray *arr = [NSArray arrayWithObjects:obj0,obj1,obj2, nil];
   那么arr数组里面只有一个元素obj0,因为遇到第二个元素是nil,就会停止后面的导入,且程序不会报错,这就造成安全的隐患。
   如果用语法糖,面对这种情况,程序会抛出异常,便于查找和解决问题。

 * 字典中也是类似的情况

局限性:字面量语法有个小小的限制,就是除了字符串以外,所创建出来的对象必须属于Foundation框架才行。

  • 应该使用字面量语法来创建字符串,数值,数组,字典。与常规方法相比,这么做更加简明扼要。
  • 应该通过取下标操作来访问数组下标或者字典中的键所对应的元素。
  • 用字面量语法创建数组或者字典时,若值中有nil,则会抛出异常。因此,务必确保值里不含nil。

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

编写代码时经常要定义常量,比如定义动画时长常量

#define ANIMATION_DURATION 0.5
这种方法是可以实现想要的效果,但是这样定义没有类型信息,不易被之后的阅读者理解,

static const NSTimeInterval kAnicationDuration 0.5
用此方法定义的常量包含类型信息,其好处是清楚的描述了常量的含义。如果有许多常量,此种写法能令阅读代码的人更易理解其意图。

常量的命名法:若常量局限于某个类里面,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。

变量一定要同时用static与const来声明。如果试图修改const修饰符所声明的变量,那么编译器就会报错。static修饰符则意味着该变量仅在此变量所在的类中可用

如果要公开一个常量,即全局常量,则这样定义

在头文件中声明
extern NSString *const EOCStringConstant;
在实现文件中定义
NSString *const EOCStringConstant = @"value";
  • 不要用预处理指令定义常量。
  • 在.m文件中使用 static const 来定义只在本类中使用的常量。(不用为其加名称前缀,加k)
  • 在头文件中使用extern来声明全局常量,并在相关实现文件中定义其值。(用相关类名做前缀)

5.用枚举标识状态、选项、状态码

Objective-C基于C语言,所以它也可以使用枚举类型:enum。系统框架中总能看到它的身影,但是开发者却容易忽视它,枚举用的好的话,不仅使代码看起来更加规范,明了,而且使得程序逻辑更加清晰易读

typedef NS_ENUM(NSUInteger,personType) {
    personTypeOne,//=0
    personTypeTwo=5,//=5
    personTypeThree//=6
};
手工指定某个枚举成员所对应的值,不适用编译器所分配的序号(默认第一个为0,之后递增1)

还有一种情况应该使用枚举类型,那就是定义选项的时候。如果这些选项可以互相组合,则更应如此。

typedef NS_OPTIONS(NSUInteger, personStatus) {
    personStatus0 = 1 << 0,//=1 0001
    personStatus1 = 1 << 1,//=2 0010
    personStatus2 = 1 << 2,//=4 0100
    personStatus3 = 1 << 3//=8  1000
};

personStatus personSta = personStatus0 | personStatus2;
NSLog(@"%ld",personSta);//打印结果 5
  • 凡是需要以按位或操作组合的枚举都应使用NS_OPTIONS定义、。若是枚举不需要互相组合,则应使用NS_ENUM来定义。

我们总习惯在switch语句最后加上default分支,然而这是不好的。应为当我们在枚举中又添加一个新的状态时,如果有default这个分支,那么它就会处理这个新状态。从而导致编译器不发警告信息,这就容易出现漏洞,发生错误却不知道哪里出错。如果去掉这个default分支,编译器就会发出警告信息,提示新加入的状态并未在switch分支中处理。

  • 应该用枚举来表示状态,选项,状态码。起个易懂的名字
  • 如果选项可以互相组合,则使用NS_OPTIONS
  • 定义的时候自己给其赋初值,可以不使用编译器给的默认的值
  • 最好不用default分支,起到提醒作用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容