1、类的实例初始化方法应按照命名约定以init开头
2、指定初始化方法
每个oc类,无论其有多少个初始化方法,应当选定其中一个作为指定初始化方法,指定初始化方法应确保类的每个实例变量都处于有效的状态。其他init方法间接调用指定初始化方法完成初始化。
3、instanceType关键字
使用instanceType而不是类名作为init的返回类型,便于在子类继承时继承的init方法也能正确地返回子类对象。
如果使用类名作为init返回类型,在子类中覆盖init方法并修改返回类型为子类,这样并不能解决问题,因为oc中不允许一个类同时拥有两个选择器相同,但是返回类型(或者参数类型)相同的方法。instanceType与id的异同:使用id作为返回类型也可以解决上述问题,但还是有不同:
相同的是:id和instanceType都可以作为方法的返回类型
不同的是: id可以用作任何其他类型声明,而instanceType仅能作为方法的返回类型。
instanceType将返回方法所在类型的变量,对于父类A,其init方法返回A*,而子类B,只要继承的父类的init方法使用instanceType作为返回值,子类继承而来的init方法将返回子类B*对象。
使用instanceType比id的好处:
使用id返回类型未知的对象,对id发送消息时,编译期间无法确定该对象的类型是否实际能响应该消息,可能导致运行时错误。
使用instanceType则可以在编译期间就发现潜在的错误。
4、关于初始化方法的使用规则:
- 类会继承父类的所有初始化方法,也可以为类添加任意数量的初始化方法
- 类应该有一个指定初始化方法,其他初始化方法直接或间接调用指定初始化方法。这样在需要修改逻辑时只需要修改指定初始化方法。
- 每个初始化方法在执行任何初始化之前,应该通过指定初始化方法直接或间接调用父类的指定初始化方法。
- 如果类的指定初始化方法与父类的指定初始化方法不一样,应该覆盖父类的指定初始化方法并直接或间接调用自己的指定初始化方法。
5、类方法便捷方法
如果某个类方法返回的是类的对象,例如
NSString stringWithFormat:(NSString *), …
称为便捷方法,注意在便捷方法内部,如果需要使用其他的类方法,应该使用self关键字,而不是直接使用类名,例如:
return [[sellf] alloc] initWithFormat@”“….]
原因类似于使用instanceType而不是类名,子类也能不需要任何修改就可以使用父类的便捷方法。
6、NSArray和NSMutableArray
不能将nil加入到NSMutableArry中,确实需要时可以使用nil的对象化包装NSNull实现,例如:
[items addObjects:[NSNull null]];在NSMutableArray中,可以直接使用下标语法向数组添加或修改对象,而不会出错。
例如:
NSMutableArray* array=[[NSMutableArray alloc] init];
array[0]=@”element0”;快速遍历语法,只能遍历数组,对数组进行增删还是需要传统的for循环
for (type *object in collection) {
}
7、@import Foundation;等价#import