zoukankan      html  css  js  c++  java
  • 编写高质量iOS代码与OS X代码的effective方法(小结)

    一、熟悉OC:

    了解OC的起源:

    OC和C++,Java等面向对象语言类似,不过有很方面差别。因为该语言使用  消息结构而非函数调用。

    消息结构和函数调用的区别:前者是在其运行时所应执行的代码由运行环境来决定,后者由编译器决定,

    若函数调用是多态的,由“虚方法表”(即是动态派发和运行时方法绑定采用的机制)查出到底执行哪个函数来实现。

    关于前向声明

    1.除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前说明来提及别的类,

          并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合(coupling)。

    2. 有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量把该类遵循某些以的这条声明

    移到class-continuation分类中,如果不行就把协议单独放在一个头文件中,然后将其引入。

    (如果一个协议需要在多个类使用就可以这样新建一个.h文件来把那些公共的协议写在里面,就可以在很多地方引入使用)

    关于字面量语法

    1使用字面量语法代替此类对象的常规方法创建NSStirng,NSNumber,NSArray,NSDictionary.

    2通过取下标操作访问数组或者字典的键对应的元素

    3使用字面量语法创建数组或者字典时,若值中有nil,会抛出异常,所以务必确保值里不含nil

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

    如:在.m文件中定义

    static const NSTimeInterval kAnimationDuration = 0.3

    5全局常量:在头文件中使用extern来声明全局常量,在其相关实现文件中定义其值,

    如:extren NSString *const LXLoginManagerNotification; .h

    NSString *const LXLoginManagerNotification = @"LXLoginManagerNotification ";.m

    关于枚举:NS_ENUM或者NS_OPTIONS

    1用枚举表示状态,选项,状态码

    如:

    typedef NS_ENUM(NSInteger, DMTotalInvestmentType) {
        DMTotalFincanceType = 0,
        DMHoldFincanceType = 1 ,
        DMOutFincanceType = 2 ,
    };

    二、对象、消息、运行期

    关于属性

    1可以用@property语法来定义对象中所封装的数据

    2在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,则应通过属性来写。

    3在初始化方法及dealloc方法中,总是应该直接通过实例变量来读写数据

    4有时候会使用惰性初始化技术配置某一份数据,这时候通过属性来读取数据

    如:-(UIView *)blueView{

    if (!_blueView)

    {_blueView = [blueView new];

    }

    return _blueView;

    }

    关于对象等同性

    1检测对象的同等性,提供isEqual:和hash方法

    关于类族模式

    1以类族模式隐藏实现细节,首先要定义抽象基类 ==重构

    在既有类中使用关联对象

    1在既有类中使用关联对象存放自定义数据

    如:

    #import <objc/runtime.h>
    static void *Akey = @"Akey";
    - (IBAction)doClick:(id)sender {

     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"question" message:@"What do you want to do?" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"continue", nil];
        void (^block)(NSInteger) = ^(NSInteger buttonIndex){
        
            if (buttonIndex==0) {
              [self cancel];
            }else{
            
             [self doContinue];
            
            }
        
        };
        objc_setAssociatedObject(alert, Akey, block, OBJC_ASSOCIATION_COPY);
        [alert show];
    }
    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

        void (^block)(NSInteger) = objc_getAssociatedObject(alertView, Akey);
        block(buttonIndex);

    }

    理解objc_msgSend的作用:

    1消息由接受者,选择子及参数构成。给对象发送消息就相当于在改对象上调用方法。void objc_msgSend(id self,SEL cmd,…);

    2发给某对象的全部消息都要由 动态信息派发系统来处理,该系统会查出对应方法并执行其代码

    理解消息转发机制:

    经常遇到的崩溃信息:unrecognized selector sent to instance.这种办法处理过程:

    1所属 的类看看能不能动态添加方法,动态方法解析;

    2请接受者看有没有其他对象处理这条信息,如果有转给它,如果没有就启动完整的消息转发机制,

    给接受者最后一次机会设法解决当前未处理的这条信息。

    三、接口与API设计

    使用前缀避免命名空间冲突

    1变相实现命名空间;选择与公司,app或二者皆有关联之名称作为类名前缀,

    并在所有代码中均使用这一前缀;若自己所开发的程序库中用到第三方库,为其名称加上前缀

    2在类中提供一个全能初始化方法并在文档里声明,其他初始化方法均应调用此方法,

    如果全能初始化方法和超类不同,复写超类中的对应方法。

    3实现description方法打印有意义的信息调用description方法;

    若想在调试时候打印出更详尽的对象描述信息,则要实现debugDescription方法

    4使用清晰而协调的命名方式

    5为私有方法名加上前缀

    四、协议与分类

    1如果要在委托对象上调用可选的方法,那么必须提前使用类型信息查询方法:respondsToSelector

    2将类 的实现代码分散到便于管理的数个分类之中

    3不要在分类中定义属性

    4通过分类向类中新增实例变量,扩充私有方法不被人知道

    五、内存管理

    1在dealloc方法里面,应该做的事情就是释放引用并解除监听通知

    2弱引用避免保留环:

    3遍历collection有四种方式:for循环;NSEnumerator遍历法,快速遍历法,块枚举法。

    多使用块枚举

    如:-(void) enumerateObjectsUsingBlock:(void(^)(id object,NSInteger idx,BOOL *stop))block;

    -(void) enumerateObjectsUsingBlock:(void(^)(id object,NSInteger idx,BOOL *stop))block{

    if(shouldStop){

    stop = yes;

    }

    }

    六、块与大中枢派发(GCD)

    1块的概念,可以接受参数和返回值,可以分配在栈或者堆中,也可以是全局。

    2为常用的块类型创建typedef

  • 相关阅读:
    The best programmers are the quickest to Google
    NetBeans 时事通讯(刊号 # 117 Sep 16, 2010)
    Apache HttpClient 4.0.3 GA 发布
    warning LNK4070的解决办法
    看泡沫
    早秋精神
    NetBeans 时事通讯(刊号 # 117 Sep 16, 2010)
    Maven 3.0 RC1 发布
    关于类的数据成员的访问权限设计的一些思考
    看泡沫
  • 原文地址:https://www.cnblogs.com/linxiu-0925/p/5440031.html
Copyright © 2011-2022 走看看