Effective OC : 1-5

来源:互联网 发布:dsa p57 数据升级工具 编辑:程序博客网 时间:2024/05/16 06:37

1,了解Objective-C语言的起源:

OC为C语言的超集,为C添加了面向对象的特性。

要理解C中的指针和内存模型。


2.在类文件中尽量少引入其他头文件:

引入过多头文件,将借口暴露,增加耦合度,这显然是不可取的。

对于一个类B的声明中调用其他的类A,如果头文件中内容只是简单引用对象,而并不需要知道其所有的接口细节时,不应该引入类A的头文件。而使用forward declaring方式来向前声明该类:

@class A

而如果实现中必须知道接口细节时,再将头文件引入,这样,将引入头文件的时机尽量延后,只在确定需要时才引入。

循环引用会引起死循环。

协议即接口,显然应该放在一个单独的头文件中。

对于不太重要的属性,可以将其放在 class-continuation中,减少在头文件中的内容,以降低编译时间和降低彼此的依赖程度。


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

对于Foundation框架中的NSString、NSNumber、NSArray、NSDictionary类,对于起创建,一般使用字符串字面量string literal:

NSString *someString = @"a String";NSNumber *number = @{x * y };NSArray *animals = @[@"cat",@"dog",@"mouse"];NSDictionary *personData = @{@"firstName":@"matt",@"lastname":@"Galloway",@"age":@28};NSString *str =  personData[@"lastname"];
需要注意的是,对NSDictionary和NSArrary创建时,不应该有nil即空值,因为字面量语法实际上是一种语法糖的语法,即对一定语句的缩减版本,而这里调用的是不定参数的构造函数,相当于执行以下方法:

NSArray *animals = [NSArray array WithObjects:cat,dog,mouse,nil];
因为在不定参数的函数中以nil结尾,所以如果使用字面量语法,在参数中使用nil就会抛出异常。


使用字面量语法,所用的对象必须是属于Foundation。就是只能对所说的4个,而本身这些对象都是不可变的。对于起可变版本即带mutable,只能自行复制一份,如下:

NSMutableArray *mutable =  [@[@1,@2,@3] mutableCopy] ;

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

C中的陋习,在C++和OC中都有了常量后,就应该使用常量了。简单来说,优点是带类型,方便检测,加 不会缩小命名空间。

不打算公开某常量的话,就应该将其定义在实现文件中。

使用const static来修饰静态常量,const表示常量,static表示该变量的仅在本编译单元可见,不带static就是全局变量了。

使用extern来修饰全局常量,跟C++和C一样,现在头文件中声明,再在实现文件中定义。针对指针时,放在*号前表示地址是常量,放在*后表示地址指向内容是常量。


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

OC中的枚举,编译器自动为枚举分配编号,一般从0开始依次递增。实现枚举所用的数据类型取决于编译器。定义枚举变量的方式很蠢:

enum ABCEnum{ a, b, c,};enum ABCEnum en = a;
而OC中可以省略这个enum,通过typedef:

typedef enum ABCEnum ABCEnum;

这样,之后就可以使用枚举名来代替完整的enum ABCEnum了。

C++11中可以指明何种“底层数据类型”来保存枚举类型的变量。这样就可以提前声明枚举变量。而在不能指定底层数据类型时,无法向前声明枚举类型的原因是,编译器不清楚底层数据类型的大小,所以无法为变量分配空间,也就无法声明变量。向前声明指定数据类型如下:

enum ABCEnum : NSInteger;
当然,在定义枚举时,指定数据类型,也是在枚举名后添加冒号加数据类型。

枚举中可以不是哟个默认的0,自定设定的值,而之后的值就从自定的值开始依次递增:

enum ABCEnum : NSInteger{ A , B = 1000, C ,};
而一般在使用枚举类型的变量定义选项时,选项是彼此组合的,也就是用到按位或操作 | 时,就要设置枚举值都是合理移位后的值:

enum ABCEnum{ A = 1 << 0, B = 1 << 1, C = 1 << 2,};
这样可以通过或操作来组合多个选项,方便快捷。
在switch中使用枚举时:

switch(abc){A:break;B:break;C:break;}
OC中的switch可以省略case.








0 0