|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最近一直都在学习有关ios(苹果系统)的知识,而学习ios的最好方法就是研究iPhone和ipad。因为iPhone和iPad的应用程序都是用Objective-C语言来开发的,所以在接触ios之前,我必须有一定的Objective-C基础。objection是一个轻量级的依附注进框架,受Guice的启示,GoogleWallet也是利用的该项目。「依附注进」是面向对象编程的一种计划形式,用来削减代码之间的耦合度。一般基于接口来完成,也就是说不必要new一个对象,而是经由过程相干的把持器来猎取对象。2013年最火的PHP框架laravel就是个中的典范。
假定有以了局景:ViewControllerA.view里有一个button,点击以后push一个ViewControllerB,最复杂的写法相似如许:- -(void)viewDidLoad{[superviewDidLoad];UIButton*button=[UIButtonbuttonWithType:UIButtonTypeSystem];button.frame=CGRectMake(100,100,100,30);[buttonsetTitle:@"Button"forState:UIControlStateNormal];[buttonaddTarget:selfaction:@selector(buttonTapped)forControlEvents:UIControlEventTouchUpInside];[self.viewaddSubview:button];}-(void)buttonTapped{ViewControllerB*vc=[[ViewControllerBalloc]init];[self.navigationControllerpushViewController:vcanimated:YES];}
复制代码 如许写的一个成绩是,ViewControllerA必要importViewControllerB,也就是对ViewControllerB发生了依附。依附的工具越多,保护起来就越贫苦,也简单呈现轮回依附的成绩,而objection恰好能够处置这些成绩。
完成办法是:先界说一个协定(protocol),然后经由过程objection来注册这个协定对应的class,必要的时分,能够猎取该协定对应的object。关于利用方无需体贴究竟利用的是哪一个Class,归正该有的办法、属性都有了(在协定中指定)。如许就往除对某个特定Class的依附。也就是一般所说的「面向接口编程」。- JSObjectionInjector*injector=[JSObjectiondefaultInjector];//[1]UIViewController<ViewControllerAProtocol>*vc=[injectorgetObject:@protocol(ViewControllerAProtocol)];//[2]vc.backgroundColor=[UIColorlightGrayColor];//[3]UINavigationController*nc=[[UINavigationControlleralloc]initWithRootViewController:vc];self.window.rootViewController=nc;
复制代码
- [1]猎取默许的injector,这个injector已注册过ViewControllerAProtocol了。
- [2]猎取ViewControllerAProtocol对应的Object。
- [3]拿到VC后,设置它的某些属性,好比这里的backgroundColor,由于在ViewControllerAProtocol里有界说这个属性,以是不会有warning。
能够看到这里没有援用ViewControllerA。再来看看这个ViewControllerAProtocol是怎样注册到injector中的,这里触及到了Module,对Protocol的注册都是在Module中完成的。Module只需承继JSObjectionModule这个Class便可。- @interfaceViewControllerAModule:JSObjectionModule@end@implementationViewControllerAModule-(void)configure{[selfbindClass:[ViewControllerAclass]toProtocol:@protocol(ViewControllerAProtocol)];}@end
复制代码 绑定操纵是在configure办法里举行的,这个办法在被增加到injector里时会被主动触发。- JSObjectionInjector*injector=[JSObjectiondefaultInjector];//[1]injector=injector?:[JSObjectioncreateInjector];//[2]injector=[injectorwithModule:[[ViewControllerAModulealloc]init]];//[3][JSObjectionsetDefaultInjector:injector];//[4]
复制代码
- [1]猎取默许的injector
- [2]假如默许的injector不存在,就新建一个
- [3]往这个injector里注册我们的Module
- [4]设置该injector为默许的injector
这段代码能够间接放到+(void)load里实行,如许就能够制止在AppDelegate里import各类Module。
很少去思考,没有去多问几个为什么。这是学习的大忌,我认识到了自己学习方法上的错误。孔子说,学而不思则罔,思而不学则殆。一点也没错,学和思是要结合的,这样才能进步。现在回想一下,我学到了什么?自己也无言以对了。 |
|