objection是一个轻量级的依赖注入框架,受Guice的启发,Google Wallet也是使用的该项目。「依赖注入」是面向对象编程的一种设计模式,用来减少代码之间的耦合度。通常基于接口来实现,也就是说不需要new一个对象,而是通过相关的控制器来获取对象。2013年最火的PHP框架laravel就是其中的典型。
假设有以下场景:ViewControllerA的view里有一个button,点击之后push到ViewControllerB,最简单的写法类似这样:
- (void)viewDidLoad { [super viewDidLoad]; UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(100, 100, 100, 30); [button setTitle:@"PUSH" forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } - (void)buttonTapped { ViewControllerB *vc = [[ViewControllerB alloc] init]; [self.navigationController pushViewController:vc animated:YES]; }
这样写的一个问题是,ViewControllerA需要import ViewControllerB,也就是对ViewControllerB产生了依赖。依赖的东西越多,维护起来就越麻烦,也容易出现循环依赖的问题,而objection正好可以处理这些问题。
下面我们来看下使用objection如何实现上面的需求。
首先,定义一个协议(protocol),然后通过objection来注册这个协议对应的Class,需要的时候,可以获取该协议对应的object。对于使用方无需关心到底使用的是哪个Class,反正该有的方法、属性都有了(在协议中指定)。这样就去除了对某个特定Class的依赖。也就是通常所说的「面向接口编程」。
// 获取默认的injector,这个injector已经注册过BViewControllerProtocol了 JSObjectionInjector *injector = [JSObjection defaultInjector]; // 获取BViewControllerProtocol对应的Object UIViewController <BViewControllerProtocol> *vc = [injector getObject:@protocol(BViewControllerProtocol)]; // 拿到vc后,设置它的属性,因为在BViewControllerProtocol里有定义对应的属性,所以不会有warning vc.backgroundColor = [UIColor redColor]; vc.currentIndex = 1000; [self.navigationController pushViewController:vc animated:YES];
可以看到这里没有引用BViewController。
再来看看这个BViewControllerProtocol是如何注册到injector中的,这里涉及到了Module,对Protocol的注册都是在Module中完成的。Module只要继承JSObjectionModule这个Class即可。
@interface BViewControllerModule : JSObjectionModule @end @implementation BViewControllerModule - (void)configure { [self bindClass:[BViewController class] toProtocol:@protocol(BViewControllerProtocol)]; } @end
绑定操作是在configure方法里进行的,这个方法在被添加到injector里时会被自动触发。
// 获取默认的injector JSObjectionInjector *injector = [JSObjection defaultInjector]; // 如果默认的injector不存在,就新建一个 injector = injector ? : [JSObjection createInjector]; // 往这个injector里注册Module injector = [injector withModule:[[BViewControllerModule alloc] init]]; // 设置该injector为默认的injector [JSObjection setDefaultInjector:injector];
上面这段代码可以直接放到 + (void)load里执行,这样就可以避免在AppDelegate里import各种Module了。
因为我们无法直接获得对应的Class,所以必须要在协议里定义好对外暴露的方法和属性,然后该Class也要实现该协议。
@protocol BViewControllerProtocol <NSObject> @property (nonatomic) NSUInteger currentIndex; @property (nonatomic) UIColor *backgroundColor; @end @interface BViewController : UIViewController<BViewControllerProtocol> @end
通过objection实现依赖注入后,就能更好地实现SRP(Single Responsibility Principle),代码更简洁。
本文的demo示例下载:http://download.csdn.net/detail/jsntghf/8584513
相关推荐
在 iOS 开发中,依赖注入是一种设计模式,它允许我们将对象的依赖关系在运行时动态地传入,而不是在类的初始化时硬编码。这有助于降低耦合度,使得单元测试变得更加容易,因为我们可以为测试创建模拟对象,而无需...
在iOS开发领域,Objection是一个流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是底层数据管理。本文将深入探讨“objection修改计划”中的iOS新增功能,旨在帮助开发者更...
`objection` 是一个基于 ` Frida ` 的 Android 动态分析框架,它提供了一种简单易用的方式来挂钩(hook)应用,探索其内部工作原理,以及进行一系列的内存操作。`Wallbreaker` 是 `objection` 的一个插件,增强了类...
在Python开发中,Objection库的使用极大地简化了与目标应用程序交互的过程。它支持多种功能,包括但不限于: 1. **远程控制**:Objection可以连接到目标设备,通过TCP或USB接口实现远程控制,允许安全研究人员在...
然而,对于"objection-1.0.2.tar.gz"这样的源代码包,我们需要先解压缩,然后通过编译和安装步骤来使用。解压后,我们可以看到文件夹"objection-1.0.2",它可能包含以下结构: - `setup.py`:这是Python项目的核心...
【Android-objection.zip】是一个与Android系统相关的压缩文件,其中包含了名为`objection-master`的项目或库。从描述中我们可以推断,这个文件可能与Android应用的安全性和逆向工程有关,因为“反对-运行时移动探索...
**Node.js与Objection.js ORM** Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它以其异步非阻塞I/O和高性能而受到广大...无论是小型项目还是大型应用,Objection.js都能作为一个强大的工具,提升开发效率。
【标题】"Objection Detection.zip" 是一个关于物体检测技术的压缩包,特别是针对车辆检测的应用。这个项目可能包含了一套基于YOLO(You Only Look Once)算法的Python实现,用于实现实时的车辆识别系统。 YOLO是...
iOS一键重签名,轻松制作iOS上任意应用或游戏分身、以及Hook后重签名安装到非越狱或越狱设备等,以下是功能说明 1. 自动识别传入的文件为.app文件或.ipa文件,并进行不同的处理 2. 可指定重签名后ipa导出路径...
可以使用objection.js关系表达式来获取结果的关系。 在路线中使用异议查找非常简单: const findQuery = require ( 'objection-find' ) ;// Our objection.js model.const Person = require ( '../models/Person' )...
3.汇总和报告在模型上创建快速计数和总和可以大大加快开发速度。 一个示例可以是客户模型的numberOfOrders 。捷径安装npm i objection-filter --save objection-filter> = 1.0.0与旧查询完全向后兼容,但现在支持...
反对软删除 使用您的Objection.js模型自动处理软删除。安装从npm安装: npm install objection-softdelete 使用异议实例注册插件: const objectionSoftDelete = require ( 'objection-softdelete' ) ;...
一些常用的越狱工具有checkra1n、Unc0ver和Chimera等,它们利用特定的iOS版本漏洞来实现设备的自由化。 2. **Objective-C和Swift**:iOS应用程序主要使用Objective-C和Swift编写。因此,理解这两种编程语言的基本...
因为我总是在项目中花费相同的时间来创建相同的结构,所以我可以用它来提供更多很棒的功能:) 用法 这是一个全局程序包,应在项目的根目录下运行。 初始化 首先,运行: agile-model init 这将在项目根目录中创建一...
安装NPM npm i objection-password 纱yarn add objection-password 版本兼容性节点版本插件版本<12> = 12 > = 3.x 如果您使用的是Node 12或更高版本,请使用插件的3.x版本,因为它包含bcrypt 5.x ,其中包含重要的...
【Frida】【Android】05_Objection实战 示例程序
本篇文章将深入探讨如何在Citrus项目中使用Objection.js进行模型定义,以提升开发效率和代码可维护性。 首先,让我们理解什么是ORM。ORM是一种编程技术,用于提供一个中间层,将应用程序的逻辑与底层的数据库结构...
在Swift应用中,Objection可以帮助开发者避免硬编码依赖,通过配置和注解来管理对象的生命周期。这样,测试和替换组件变得更加容易,提高了代码的可扩展性和可维护性。 4. 路由(Routing): 在App开发中,路由...
**Objection** 是一个轻量级的对象映射器(Object Relational Mapper,ORM),用于iOS和macOS开发。它简化了数据库操作,使得开发者无需直接编写SQL语句,而是通过对象来操作数据。Objection还提供了一种简单的方式...
bizhi, 使用 ReactiveCocoa2/MVVM/objection 创建壁纸应用程序 简介一个简单的壁纸应用演示了使用 ReactiveCocoa2,MVVM和反对屏幕截图 安装克隆到本地后,运行 pod install