-
面向对象-六大原则
- 单一职责原则【SRP】 -- 就一个类而言,应该仅有一个引起他变化的原因
- 开闭原则[【OCP】-- 对于扩展是开放的 对于本类修改是关闭的
- 里氏替换原则【LSP】
子类可以实现父类的抽象方法,但是不能覆盖,且返回值要比父类严谨
子类可以添加的独立方法,也可以重载,但是重载的时候要比父类的方法参数宽松- 依赖倒置原则【DIP】
高层次模块不应该依赖低层次模块
抽象不应该依赖细节
细节应该依赖抽象- 接口隔离原则【ISP】
客户端不应该依赖不需要的接口(避免接口设计的时候 有冗余的方法)- 迪米特原则【LOD】
一个对象应该对其他对象保持最小的了解 (降低类与类之间的耦合)另外百度百科提供了五大原则
- 里式替换原则(跟上面的一样)
- 依赖倒转原则 (跟上面一样)
- 接口隔离(同上)
- 合成/聚合复用原则
在一个新对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。设计原则就是尽量使用复合 不使用继承。- 最少知识原则 (迪米特原则)
-
继承和复合 - 类的两大关系
复合优先于集成
因为继承破坏了封装性,子类的过度依赖超类中的实现细节。超类有可能会随着版本更新而变化,子类这时候就非常容易遭到破坏。只有当子类和超类之间确实存在父子类型的关系,使用继承才算合理,并且在明确知道父类实现或者有很好的设计文档的时候。
-
设计模式
这个内容有点儿多 ,一点点而来
-
常用的Attribute
在开发中为了使代码更规范,提供给别人使用时更安全,我们会经常用到一些attribute。
attribute是GNU的一种编译指令在声明的时候指定某种特性,能够做到多样化的错误检查和高级优化。
NS_UNAVAILABLE -- 指定 方法不可调用
例如我们在写单例的时候,为了防止别人调用的时候init初始化 我们可以直接将init方法使用该关键字- (instancetype)init NS_UNAVAILABLE;
DEPRECATED_ATTRIBUTE -- 方法过期
/** 方法h过期 */ - (void)method DEPRECATED_ATTRIBUTE; // 这里可以提示给其他开发者 替换的方法 - (void)method1 __attribute__ ((deprecated("# 请使用 init")));
NS_DEPRECATED_IOS(5_0, 12_0) -- 可以指定该方法依附的版本有效
- (void)method4 NS_DEPRECATED_IOS(5_0, 12_0);
NS_DESIGNATED_INITIALIZER
/** 这个关键字 用来修饰init方法,被修饰的init方法 必须调用super的NS_DESIGNATED_INITIALIZER方法 */ - (instancetype)initMethod5 NS_DESIGNATED_INITIALIZER;
以上这些 都是iOS 框架封装成的宏,里面展开就是__attirbute__ 。
objc_requires_super -- 标识方法被子类重写的时候 必须调用 super
- (void)method6 __attribute__((objc_requires_super));
objc_subclassing_restricted -- 标识该类不可以被继承
__attribute__((objc_subclassing_restricted)) /** 不允许被继承 */ @interface ClassA : NSObject @end
下面介绍两个 黑魔法。。。
cleanUp -- 修饰变量,当变量超出作用域,可以指定回调
- (void)cleanUp { NSString * aIvar __attribute__((cleanup(cleanAIvar))) = @"hello world"; } static void cleanAIvar(__strong NSString ** a) { NSLog(@"cleaning a : %@", *a); }
block 也是变量, 也可以这么用,RAC里面有个宏@OnExit 就是利用这个实现的
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"); }
先介绍这么多,剩下的可以看官网