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

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

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分支,起到提醒作用

你可能感兴趣的:(编写高质量iOS的52个有效方法学习笔记(1-5))