性分配空间
而 OC 中基本数据类型就是保存一个数值,不存在可选
的概念
解决办法:给基本数据类型设置初始值
修改后的代码如下:
提示:在定义类时,基本数据类型属性一定要设置初始值,否则无法正常使用 KVC 设置数值
KVC 函数调用顺序
init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict) } override func setValue(value: AnyObject?, forKey key: String) { print("Key \(key) \(value)") super.setValue(value, forKey: key) }
setValuesForKeysWithDictionary
会按照字典中的 key
重复调用 setValue:forKey
函数
- 如果没有实现
forUndefinedKey
函数,程序会直接崩溃
- NSObject 默认在发现没有定义的键值时,会抛出
NSUndefinedKeyException
异常
- 如果实现了
forUndefinedKey
,会保证 setValuesForKeysWithDictionary
继续遍历后续的 key
- 如果父类实现了
forUndefinedKey
,子类可以不必再实现此函数
子类的 KVC 函数
- 如果父类中已经实现了父类的相关方法,子类中不用再实现相关方法
convenience 便利构造函数
- 默认情况下,所有的构造方法都是指定构造函数
Designated
convenience
关键字修饰的构造方法就是便利构造函数
- 便利构造函数具有以下特点:
- 可以返回
nil
- 只有便利构造函数中可以调用
self.init()
- 便利构造函数不能被
重写
或者 super
注意:在 Xcode 中,输入 self.init
时没有智能提示
便利构造函数应用场景
- 根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来
- 在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建
构造函数小结
- 指定构造函数必须调用其直接父类的的指定构造函数(除非没有父类)
- 便利构造函数必须调用同一类中定义的其他
指定构造函数
或者用 self.
的方式调用父类的便利构造函数
- 便利构造函数可以返回
nil
- 便利构造函数不能被重写