首页 > 学院 > 开发设计 > 正文

EffectiveObjective-C2.0之Note.01

2019-11-14 18:48:56
字体:
来源:转载
供稿:网友

 

1.在类的头文件中尽量少引入其他头文件

 

除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合(coupling)。

有时无法使用向前声明(@class 类名)(.h文件在某个类引入类对象,.m实现#import类名),比如要声明某个类遵循一项协议。这种情况下,尽量把“该类遵循某协议”的这条声明移至“class-continuation分类”中。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。

Note:@class与#import的区别

1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。

2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用 @class则不会。

4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.


 2.多用字面量语法(创建不可变对象),少用与之等价的方法

从Objective-C 1.0起,有一种非常简单的方式能创建NSString、NSNumber、NSArray、NSDictionary这样的对象。这就是“字符串字面量”(string literal),其语法如下:

    NSString *someString = @"Effective Objective-C 2.0";     NSNumber *intNumber = @1;      NSNumber *floatNumber = @2.5f;      NSNumber *doubleNumber = @3.14159;      NSNumber *boolNumber = @YES;      NSNumber *charNumber = @'a';     int x = 5;      float y = 6.32f;      NSNumber *exPRessionNumber = @(x * y);     //效果等于是先创建了一个数组,然后把方括号内的所有对象都加到这个数组中    NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"];     NSString *dog = animals[1];     NSDictionary *personData =          @{@"firstName" : @"Matt",               @"lastName" : @"Galloway",               @"age"         : @28};     NSString *lastName = personData[@"lastName"];     mutableArray[1] = @"dog";      mutableDictionary[@"lastName"] = @"Galloway";      //局限性-------使用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)。若想要可变版本的对象,则需复制一份:    NSMutableArray *mutable = [@[@1, @2, @3, @4, @5]mutableCopy];

 

 
 
 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表