Objective-C中编程中一些推荐的书写规范小结

2020-01-14 22:32:41刘景俊

比如,我们以Nib的形式创建UITableViewController,那么最后调用的就是- (instancetype)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle )nibBundleOrNil这个指定初始化方法;如果我们以Storyboard的形式创建,那么最后调用的就是- (instancetype)initWithCoder:(NSCoder *)aDecoder这个指定初始化方法。如果以代码的形式创建,那么最后调用的就是- (instancetype)initWithStyle:(UITableViewStyle)style这个指定初始化方法。所以不同的情况需要重写不同的指定初始化方法,并且重写的时候首先要调用父类相应的指定初始化方法(比如重写initWithCoder:方法,那么首先self = [super initWithCoder:…],都是一一对应的)。

再以UIViewController为例,我们以Nib的形式创建UIViewController,那么最后调用的是- (instancetype)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle )nibBundleOrNil,这与UITableViewController是一样的;如果我们以Storyboard的形式创建,那么最后调用的是- (instancetype)initWithCoder:(NSCoder )aDecoder,这与UITableViewController也是一样的;但是如果我们以代码的形式创建UIViewController(eg: CYLViewController vc = [[CYLViewController alloc] init]; CYLViewController继承自UIViewController),那么它最后调用的实际是- (instancetype)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle )nibBundleOrNil,这与UITableViewController是不一样的,因为UIViewController并没有- (instancetype)initWithStyle:(UITableViewStyle)style这个方法,所以当用代码创建的时候,最后调用的也是initWithNibName:bundle这个指定初始化方法,并且参数自动设置为nil。

所以现在反过头来再看UITableViewController,当使用代码的方式创建的时候(eg: CYLTableViewController tvc = [[CYLTableViewController alloc] init]; 或者 CYLTableViewController tvc = [[CYLTableViewController alloc] initWithStyle: UITableViewStylePlain]; ),它会调用initWithStyle:这个方法,但是如果你也实现了initWithNibName:bundle:这个方法,你会发现这个方法也被调用了。因为UITableViewController继承自UIViewController,所以当用代码创建的时候,最后也会掉用到initWithNIbName:bundle:(因为UIViewController就是这么干的)。

所以用代码创建UITableViewController的时候,它会调用initWithNibName:bundle:和initWithStyle:这两个方法。

二、属性