熟悉objective-c

1.objective-c为c语言添加了面向对象特性,湿气超级。objective-c使用东台绑定的消息结构,也就是说,在运行时才检查对象类型。接收一条消息后,究竟应执行何种代码,由运行期环境而非编译器来决定。

2.将引入头文件的时机尽量延后,只在确有需要时才引入,这样就可以减少类的使用者所需引入的头文件数量,如果在各自头文件中引入对方的头文件,则会导致“循环引用”,当解析其中一个头文件的时,编译器会发现它引用了另一个头文件,儿那个头文件又回头引用第一个头文件。使用#import而非#include指令虽然不会导致是循环,但却意味着这两个类有一个无法被正确编译

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

字面量语法语法如下:

    NSString *string = @"string";
    NSNumber *number = @12;

不用字面量方式创建:
    NSNumber *number = [NSNumber numberWithInt:12];

字面量语法更为精简,并且有很多其他好处

使用字面量创建

    NSArray *arr = @[@"obj1",@"obj2",@"obj3"];
    NSString *obj = arr[1];

不适用字面量

    NSArray *arr = [[NSArray alloc]initWithObjects:@"obj1",@"obj2",@"obj3", nil];
    NSString *obj = [arr objectAtIndex:1];
使用字面量更加简洁,不过使用字面量语法创建数组时要注意,若数组元素对象中有nil,则会抛出异常,因为字面量语法实际上只是一种“语法糖”(syntactic sugar),其效果扥与先创建一个数组,然后把方括号内的所有对象都加到这个数组中。

    id obj1 = /*....*/;
    id obj2 = /*....*/;
    id obj3 = /*....*/;
    NSArray *arrA = [NSArray arrayWithObjects:obj1,obj2,obj3, nil];
    NSArray *arrB = @[obj1,obj2,obj3];

当 obj1和obj3都指向有效对象,而obj2是nil,则按字面量语法创建数组arrB时会抛出异常,arrA虽然该创建出来,但只含有obj1一个对象,原因是arrWithObjects会一次处理各个参数,知道法相nil为止,这个微妙的差别表明使用字面量语法更为安全,抛出异常使程序终止执行,这比创建好数组后才发祥元素少了要好,同理字典也是这样

字面量语法有个小小的限制,就是除了字符串以外,岁创建的对象必须属于Foundation框架,如果自定义了这些类的子类,则无法使用字面量语法创建对象。

使用字面量语法创建的字符串,数组,字典对象都是不可变的,若想要可变版本的对象,则需要复制一份:

    NSMutableArray *mutarr = [@[@"1",@"2"]mutableCopy];

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

编写代码的时候经常要定义常量,例如,要定义一个动画时间,也许会用这种方法来做

#define ANIMATON_DURATION 0.3

上述预处理命令会吧源代码中的ANIMATION_DURATION替换成0.3,但是这样定义出来的常量没有类型信息,此外,预处理过程会把碰到的所有ANIMATION_DURATION替换成0.3,要解决此问题,应该利用编译器的某些特性才对,比如

static const NSTimeInterval kAnimationDuration = 0.3;

此处清楚地描述了敞亮的含义,由此可知改常量类型为NSTimeInterval这有助于为其编写开发文档,如果要定义许多常量,那么这种方式会令稍后的阅读代码的人更加容易理解其意图。

还要注意常量常用命名法是:若常量局限某“编译单元”之内,则在之前加字母k;若常量在类之外可见,则通常以类名为前缀。

定义常量位置很重要,在头文件中申明可能互相冲突,其实就连用static const定义的常量也不应该出现在头文件中,这样等于申明了一个全局变量,如果不打算公开某个常量,可以在实现文件了这样写

static const NSTimeInterval kAnimationDuration = 0.3;
变量一定要同时使用static和const来申明,如果不加static则编译器会创建一个“外部符号”,此时如果另一个便一单元也申明同名变量,就会报错

有事会对外公开某个常量,则可以如下定义

//  In the header file

extern NSTimeInterval *const EOCAnimationDuration

// In the implementation file


NSTimeInterval *const EOCAnimationDuration = 0.3;

猜你喜欢

转载自blog.csdn.net/chenjin360/article/details/54863086
今日推荐