ViewController的基类和基类目的讨论
在分类学习的时候,学到一种思想是能用分类就不要用继承,这个想法对不对呢,经过BaseViewController的实践,我感觉这<(  ̄^ ̄)> 真是哲学(╬ Ò ‸ Ó)呢
BaseViewController有什么好
BaseViewController的好处是一些公共样式或者私有属性可以放在基类里,调用更加方便,而且保证了我即使不键入任何一行代码,也能得到相同的初始化状态,即使有些初始化状态被更改了,进入新窗口还能改回来例如我的[BaseViewController和自定义返回键的小故事]笔记
ViewController+Base有什么好
用分类管理公共函数,更加灵活,看起来更加原生态,而且分类函数的迁移和修改都更加方便,╮(╯_╰)╭ 总之就是看起来更加original.
坏处就是如果我想得到默认样式,BaseViewController里的viewDidLoad,每当加载一个新窗口都会自动重新调用一次,但是如果用了分类,我需要单独写个函数setBaseView,在每个窗口的viewDidLoad调用setBaseView
那我就是作死小能手,就想用分类
如果实在作死,我想在分类里的setBaseView,就叫做viewDidLoad并且通过
[self viewDidLoad];
调用,会发生什么呢.
#import "ViewController.h"
#import "UIViewController+Base.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Begin ViewDidLoad");
[self viewDidLoad];
NSLog(@"End ViewDidLoad");
}
@end
对应的Base分类是
@interface UIViewController (Base)
- (void)viewDidLoad;
@end
#import "UIViewController+Base.h"
@implementation UIViewController (Base)
- (void)viewDidLoad {
NSLog(@"BaseViewDidLoad");
}
@end
作死的结果
编译器会提示一个警告,但是不会报错
Category is implementing a method which will also be implemented by its primary class
并且**NSLog(@”End ViewDidLoad”)**这个函数永远不会被执行,程序进入死循环.~( ̄▽ ̄~)(~ ̄▽ ̄)~
所以结论是
算了…还是老老实实用基类吧,不要强迫症了……