·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> EffectiveObjective-C2.0之Note.01

EffectiveObjective-C2.0之Note.01

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

 

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];