Class 继承自NSObject的内存结构
1.在swift里面没有继承自NSObject的话 那么就是8个字节存放类型信息 8个字节存放引用计数 剩下的是存放他的
属性 字节总数是16的倍数
2.如果继承自NSObject的话 那么他的内存结构是8个字节存放类型信息 剩下的是存放属性 字节总数是16的倍数
只能被Class继承的协议
1. 协议继承自AnyObject
2. 协议继承自Class
3. 协议被@objc修饰 (而且被修饰之后 还可以暴露给OC去遵守实现)
可选协议
可以通过@objc 定义可选协议 这种协议只能被class 遵守实现
@objc protocol Runnable {
@objc func run1() //run1 可选实现
func run2()
}
dynamic
被@objc dunamic 修饰的内容会具有动态性 比如调用方法会走runtime那一套流程
@objc dynamic func test1(){
}
func test2() {
}
}
var d = Dog()
d.test1()
d.test2()
KVC/KVO
支持KVC/KVO 但是 属性所在的类 监听器最终继承自NSObject
使用@objc dunamic 修饰对应的属性 才支持KVC/KVO
block方式的KVO
class Person: NSObject {
@objc dynamic var age: Int = 0
var observation: NSKeyValueObservation?
override init() {
super.init()
observation = observe(\Person.age, options: .new) {
(person,change) in
print(change.newValue as Any)
}
}
}
var p = Person()
p.age = 20
p.setValue(25, forKey: "age")
Optional(20)
Optional(25)
关联对象
class 可以使用关联对象 其他不可以
默认情况下 extension不可以添加存储属性的 借助关联对象 可以实现类似extension为class增加存储属性的效果
class Person: Runnable{
}
extension Person {
private static var AGE_KEY: Void?//1个字节
var age: Int {
get{
return (objc_getAssociatedObject(self, &Person.AGE_KEY) as? Int) ?? 0
}
set{
objc_setAssociatedObject(self, &Person.AGE_KEY, newValue, .OBJC_ASSOCIATION_ASSIGN)
}
}
}
资源名管理
使用枚举实现
网友评论