字学镜像计划-OC基础(大纲)

1,013 阅读2分钟

Define Class

  • 继承关系
  • 属性(@property)
    • ivar(成员变量)
    • getter & setter
    • 修饰符copy、strong、assign、weak的使用
  • 函数(method)
    • selector
    • 类函数和成员函数

Category和Extension(类别和拓展)

  • Category

    • 不能增加ivar

      Category利用@property声明属性不能自动生成成员变量。
      
    • 增强类功能

    • 分离类实现

  • Extension

    • 增加ivar
    • 主要用于接口分离
    • private

Protocol

  • Protocols Define Messaging Contracts
  • 类似于Java Inerface,描述了一组相关的方法定义
  • 开闭原则,抽象了类的功能,隐藏了具体的实现类
  • 协议可以继承于其他协议
  • 协议的约束是比较弱的,往往只会产生警告,而不会影响最终编译通过
@protocal DemoProtocal <NSObject>

@optional
- (void)optionalMethod;//实现者可以不实现,而不会有警告
@required
- (void)requiredMethod;//实现者可以不实现,会有警告
@end
  
@interface Demo : NSObject<DemoProtocal>
@property(nonatomic, weak) id<DemoProtocal> delegate; 
@end
  
@implementation
-(void)requiredMethod{
  if([delegate respondsToSelector:@selector(requiredMethod)]){
    [delegate requiredMethod];
  }
}
@end

Method Dispatch

  • 函数重载(overload)?

    • No,函数返回值和参数类型不影响函数决议,编译报错。
  • 函数覆写(override)

    • OK
  • 子类有父类的同名方法?(返回值和参数类型不同)

    • 动态决议,调用的是子类实现
    • 强行静态调用父类方法,可能crash
  • selector vs method

    • selector就是char *
    • method地址是函数地址
  • objc_msgSend

    • OC 消息传递
    • 动态解析
  • method lookup

    • 继承链
  • Type encoding

    • 方法的类型编码(参数和返回值的类型)

Memory Management

ARC

  • 引用计数和MRC

    • 手动调用retain/release/autorelease
    • 内存管理困难,容易发生内存泄露和野指针
    • ARC是什么?自动饮用计数
      • 编译器生成retain/release
      • Zeroing weak pointer(归0,自动置为nil)
      • 对象引用图,仍需要避免引用环导致内存泄露
  • strong、weak、assign

    • Ownership和对象引用图
    • 最佳实践
      • 基本类型用assign
      • delegate用weak
      • NSArray,NSDictionary和NSString、block用copy
      • 其他用strong
      • block中self用weak打破循环饮用
    • 避免引用环A-strong -> B-strong -> C-strong -> A
    • Memory graph debugger
  • Autoreleasepool

  • 循环饮用

    《Objective-C高级编程 iOS与OS X多线程和内存管理》

RunTime

  • 类和对象在运行时的结构
  • 运行时访问和修改类结构的能力
  • Apple Source Browser
  • 练习用Runtime新增一个类

思考

  1. 为什么NSString、NSArray、NSDictionary的属性要用copy集合的深浅拷贝?
  2. 如何做selector not found Crash防护?