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新增一个类
思考
- 为什么NSString、NSArray、NSDictionary的属性要用copy集合的深浅拷贝?
- 如何做selector not found Crash防护?