由林西2020/05/01依赖注入创建首先解释一下什么是依赖注入。例如,一个控制器跳转到BController,那么BController需要在一个控制器内部进行实例化。以下@ implementation controller:uiview controller...-(void)jump { b controller * b controller =[[b controller alloc]init];[self . navigation controller pushview controller:b controller animated:YES];}@end如果这样做,AController封装成组件后,BController的配置将受到限制,任何BController的细节都不能从外部更改。所以我们* *稍微改成* * @ implementation controller:uiview controller...-(instance type)initwithcreateblock:(uiview controller *)(void))createBViewControllerBlock {....self . createBViewControllerBlock = createBViewControllerBlock;...}-(void)jump { uiview controller * b controller = self . createbviewcontrollerblock();[self . navigation controller pushview controller:b controller animated:YES];} @ end[[a controller alloc]initwithcreateblock:uiview controller * ^{ b controller * b controller =[[b controller alloc]initwith title:@ " XXX "];返回bController}];BController的创建是通过Block暴露的,AController并不关心BController是如何在内部创建的,所以AController对BController的依赖会通过外部Block注入。 这就是依赖注入。 当然,这是最简单的依赖注入,无法满足我们复杂的需求,所以有时候需要使用第三方框架,比如Objection和TyphoonObjection。接下来,我们来解释一下异议的用法。Objection是一个依赖注入框架,当你得到一个类的实例时,类内部的属性也会被实例化。 比如://Car.h@class发动机,Break@界面车:NSObject@property(非原子,强)Engine * engine@property(非原子,强)Break * breaks@ end//car . m # import & lt;反对/反对. & gt@ implementation car object _ requirements(@“engine”,@“breaks”)@ end创建默认注射器jsobjectioninjector * injector =[jsobjectioncreateinjector];[JSObjection setDefaultInjector:injector];实例化汽车对象car * car = [[JS异议默认注入器]getObject:[汽车类]];此时,从属引擎对象和breaks对象将实例化最后一个打印属性Car < Car:0x 6000006d 8480 & gt;引擎& lt引擎:0x6000004841b0 & gt中断& ltbreak:0x 6000004841 E0 & gt;如果Car对象不能被init或initWithXXX实例化,我们需要指定方法,这样注入器就可以在指定的方法中建立依赖关系@ implementationcarobject _ requirements(@“engine”)。@ " breaks ")-(void)awake from nib {[[JSObjection default injector]inject dependencies:self];}@end当汽车被注射器初始化时,会调用-awakefromobject方法,其中可以添加少量的value-(void)awakefrominjection { self . test = @ " 111 ";}以上都是init直接初始化的对象,但更多情况下我们需要指定构造方法@ implementation car object _ initializer _ sel(@ selector(init with object:)//这个宏只能出现一次——(instance type)init with object:(id)object { if(self =[super init]){ self . test = object;}回归自我;}@end拿出来的时候添加argumentList: parameter到car * car = [[JS异议默认注入器] getObject: [car class]参数列表:@[@ " AAAA "]];或者不想写object _ initializer _ sel()宏,可以直接在取数方法中修改,改成car * car = [[JS对象默认注入器] getobject: [car类]initializer:@ selector(initwithobject:)argument list:@[@ " AAAA "]];效果是一样的。在Car中添加一个对象工厂属性@ property (nonatomic,strong)js object factory * object factory;然后在标签注入中添加一个对象工厂object _ requirements(@“engine”,@“breaks”,@“object factory”),然后通过idobj = [self就可以得到了。对象工厂getobject:[引擎类]];获取相应的对象模块。可以创建一个继承自JSObjectionModule的模块,在里面绑定相应的东西,就可以直接得到协议、模块类等相应的值。该对象与类名和协议@ protocolapiservice绑定在一起 总结目标帮助您实现* *依赖注入* *。你只需要完成两件事,配置依赖关系和获取依赖对象。 配置依赖项时,可以使用几个常用的宏来快速完成依赖项的配置。此外,还可以利用模块的概念来完成更多的绑定操作。它允许您将某些类或某些协议接口绑定到某些或某些类型的对象。配置完成后,您可以使用key injector来获取您需要的对象。