• Effective Objective-C 2.0之Note.01


    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];
     
     
     
    如有疑问,共同探讨,共同进步。
  • 相关阅读:
    谈屡面屡胜的面试经验
    同步异步和阻塞非阻塞的区别
    Ansible条件测试
    Ansible playbook基础组件介绍
    Ansible的基础元素和YAML介绍
    Ansible常见模块介绍
    Ansible介绍及安装部署
    Spark介绍及安装部署
    安装部署Apache Hadoop (完全分布式模式并且实现NameNode HA和ResourceManager HA)
    安装部署Apache Hadoop (本地模式和伪分布式)
  • 原文地址:https://www.cnblogs.com/nielsen/p/4828128.html
Copyright © 2020-2023  润新知