点滴汇总

 

  • 面向对象-六大原则

  1. 单一职责原则【SRP】 -- 就一个类而言,应该仅有一个引起他变化的原因
  2. 开闭原则[【OCP】-- 对于扩展是开放的 对于本类修改是关闭的
  3. 里氏替换原则【LSP】
    子类可以实现父类的抽象方法,但是不能覆盖,且返回值要比父类严谨
    子类可以添加的独立方法,也可以重载,但是重载的时候要比父类的方法参数宽松
  4. 依赖倒置原则【DIP】
    高层次模块不应该依赖低层次模块
    抽象不应该依赖细节
    细节应该依赖抽象
  5. 接口隔离原则【ISP】
    客户端不应该依赖不需要的接口(避免接口设计的时候 有冗余的方法)
  6. 迪米特原则【LOD】
    一个对象应该对其他对象保持最小的了解 (降低类与类之间的耦合)

另外百度百科提供了五大原则

  1. 里式替换原则(跟上面的一样)
  2. 依赖倒转原则 (跟上面一样)
  3. 接口隔离(同上)
  4. 合成/聚合复用原则
    在一个新对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。设计原则就是尽量使用复合 不使用继承。
  5. 最少知识原则 (迪米特原则)
  • 继承和复合 - 类的两大关系

复合优先于集成

因为继承破坏了封装性,子类的过度依赖超类中的实现细节。超类有可能会随着版本更新而变化,子类这时候就非常容易遭到破坏。只有当子类和超类之间确实存在父子类型的关系,使用继承才算合理,并且在明确知道父类实现或者有很好的设计文档的时候。

  • 设计模式 

简单工厂、工厂方法、抽象工厂

这个内容有点儿多 ,一点点而来

  • 常用的Attribute 

在开发中为了使代码更规范,提供给别人使用时更安全,我们会经常用到一些attribute。

attribute是GNU的一种编译指令在声明的时候指定某种特性,能够做到多样化的错误检查和高级优化。

  1. NS_UNAVAILABLE -- 指定 方法不可调用
    例如我们在写单例的时候,为了防止别人调用的时候init初始化 我们可以直接将init方法使用该关键字

    - (instancetype)init NS_UNAVAILABLE;
    

     

  2. DEPRECATED_ATTRIBUTE -- 方法过期
     

    /** 方法h过期 */
    - (void)method DEPRECATED_ATTRIBUTE;
    // 这里可以提示给其他开发者 替换的方法
    - (void)method1 __attribute__ ((deprecated("# 请使用 init")));

     

  3. NS_DEPRECATED_IOS(5_0, 12_0) -- 可以指定该方法依附的版本有效
     

    - (void)method4 NS_DEPRECATED_IOS(5_0, 12_0);

     

  4. NS_DESIGNATED_INITIALIZER 
     

    /** 这个关键字 用来修饰init方法,被修饰的init方法 必须调用super的NS_DESIGNATED_INITIALIZER方法 */
    - (instancetype)initMethod5 NS_DESIGNATED_INITIALIZER;

    以上这些 都是iOS 框架封装成的宏,里面展开就是__attirbute__ 。

  5. objc_requires_super -- 标识方法被子类重写的时候 必须调用 super
     

    - (void)method6 __attribute__((objc_requires_super));
    

     

  6. objc_subclassing_restricted -- 标识该类不可以被继承
     

    __attribute__((objc_subclassing_restricted)) /** 不允许被继承 */
    @interface ClassA : NSObject
    @end

    下面介绍两个 黑魔法。。。

  7. cleanUp -- 修饰变量,当变量超出作用域,可以指定回调
     

    - (void)cleanUp {
        NSString * aIvar __attribute__((cleanup(cleanAIvar))) = @"hello world";
    }
    
    static void cleanAIvar(__strong NSString ** a) {
        NSLog(@"cleaning a : %@", *a);
    }

    block 也是变量, 也可以这么用,RAC里面有个宏@OnExit 就是利用这个实现的

  8. overloadable -- 可以重载c函数
     

    __attribute__((overloadable)) void des(NSString * str){
        NSLog(@"String class");
    }
    
    __attribute__((overloadable)) void des(NSNumber * num ){
        NSLog(@"Number class");
    }
    {
        des(@1);
        des(@"Hello world");
    }


     

  9. 先介绍这么多,剩下的可以看官网

 

你可能感兴趣的:(一点点儿。。。,iOS,总结)