使用instancetype指定返回类型,
明确它和id之间的区别,
isntancetype 指定的是和init初始化的对象(self)相同类型的对象,
而id指定的是任意类型的对象.
关于实例变量和属性——之二
不管在实现文件中显式声明的实例变量,或者是使用@synthesize隐式生成的实例变量,它们都是私有的。子类中无法通过实例变量名称直接访问实例变量,只能通过从父类继承的accessor访问。
@synthesize方法可能会进行额外的工作,比如内存管理,复制值等,而这些工作在直接对实例变量进行读写操作时不会发生。
故在属性和实例变量之间还有一个抽象层,这一层让系统有机会来做一些额外工作(只有当需要访问实例变量的时候才进行的,可以理解为:对实例变量指向的空间进行分配并初始化等工作,所以不需要对这一层深究)。
简单来说,不需要人为指定@synthesize指令,编译器会为用户声明的属性自动生成实例变量以及访问方法(accessor),自动生成的访问方法命名规则如下:
- getter方法:和属性名相同。
- setter方法:属性名前加set,如firstName,则生成setFirstName。
实例变量(instance Variable):属性名前加下划线,如_firstName。
实例变量直接可以在实现文件中访问,也可以通过属性名访问:
_firstName = @"王二狗";
self.firstName = @"王二狗";