1.惰性初始化:不放在整个类的对象初始化中,放在离初始化数据最近的地方可以让init的不需要初始化的垃圾更少。
2.OC里两个函数的函数名和形参数量相同时,无论返回值类型和形参类型是否相同,都会出现编译错误,这点跟java有区别。
例如:
-(void)test;
-(NSString *)test;
编译错误。
-(void)test:(NSString *)parameter;
-(void)test:(NSArray *)parameter;
编译错误。
-(void)test:(NSString *)parameter;
-(NSString *)test:(NSArray *)parameter;
编译错误。
3.instancetype类型的init与id类型的init的区别在于:a.instancetype可以告诉编译器回传类型,让编译器在编译阶段就有足够的信息判断你写的程序是否有问题,而id只能在执行阶段才能真正解析,编译器就无法帮助你了。b.id可以作为形参类型出现在函数中,而instancetype只能作为返回值。更多分析请看下面这篇文章instancetype与id的区别。
另外,可能有人会问,为什么init不的返回值类型不设置成当前类的对象?问题是,该类的子类初始化的时候应该返回的是子类的对象,如果父类将返回值类型写死,这里就会出现问题。有人会觉得这也好办,直接覆盖这个初始化方法并返回子类的对象就好了嘛,但是这种语法是不合法的,请参见第二条。所以使用id或者instancetype完美的解决了这个问题。
4.self = [super init]检测父类是否可以有效的初始化,如果可以才能初始化子类。
首先,通常情况下当某个对象收到消息时,系统会先从这个对象的类开始,查询和消息名相同的方法名。如果没有找到,则会在这个对象的父类中继续查找,该查询过程会沿着继承路径向上,知道找到相应的方法为止,没找到抛出异常。
需要这样理解这行代码:向super发送消息,其实是向self发送消息,但是要求系统在查找时跳过当前对象的类,从父类开始查找。
再多说一句,一个类可以有多个初始化方法,每个类都需要选定一个指定初始化方法,如果这个初始化方法与父类的指定初始化方法不同,需要覆盖掉父类指定初始化方法并调用新的指定初始化方法。然后这个类中的其他初始化方法调用指定初始化方法完成相应的初始化功能。
5.工具函数通常可以用类函数来表示,这种不访问任何实例变量的函数用类函数来表示更为合适。
6.重命名与视图相关的outlet或者action的时候需要先将连接断开命名再重新连接,这里特别需要注意,一旦忘记断开,当你重新将view与controller连接时,就会出现空的强指针,此时运行模拟器将会在一开始就黑屏,系统无法有效的初始化view。