技术标签: 开发工具、三方框架、afn
框架:模块化
http://blog.jobbole.com/66929/
实现原理:先定义一个协议(protocol),然后通过objection来注册这个协议对应的class,需要的时候,可以获取该协议对应的object。对于使用方无需关心到底使用的是哪个Class,反正该有的方法、属性都有了(在协议中指定)。这样就去除了对某个特定Class的依赖。也就是通常所说的「面向接口编程」,因为我们无法直接获得对应的Class,所以必须要在协议里定义好对外暴露的方法和属性,然后该Class也要实现该协议。
注册模块、绑定接口对应的class
JSObjectionModule 1. 新建一个继承于JSObjectionModule的类,这个类像模块容器注册此模块提供的对象。 2. 注册需要重载两个方法,+load和-configure,load是向模块容器注册这个Module类,configure是向容器注册这个Module提供的功能。
//
// protocols.h
// objectionTest
//
#ifndef protocols_h
#define protocols_h
#import <Foundation/Foundation.h>
@protocol SecondViewProtocol <NSObject>
- (void)configureWithTag:(NSString *)tag;
@end
#endif /* protocols_h */
//
// SecondModule.h
// objectionTest
//
#import "JSObjectionModule.h"
NS_ASSUME_NONNULL_BEGIN
@interface SecondModule : JSObjectionModule
@end
NS_ASSUME_NONNULL_END
//
// SecondModule.m
// objectionTest
//
//
#import "SecondModule.h"
#import "SecondViewController.h"
#import "protocols.h"
#import <Objection.h>
@implementation SecondModule
+ (void)load
{
JSObjectionInjector *injector = [JSObjection defaultInjector];
injector = injector ? : [JSObjection createInjector];
injector = [injector withModule:[[self alloc] init]];
[JSObjection setDefaultInjector:injector];
}
- (void)configure
{
[self bindClass:[SecondViewController class] toProtocol:@protocol(SecondViewProtocol)];
}
@end
//
// ViewController.h
// objectionTest
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
//
// ViewController.m
// objectionTest
//
#import "ViewController.h"
#import "protocols.h"
#import <Objection.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton * button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(100, 100, 50, 50);
[button setTitle:@"tiao" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClickeddd) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)buttonClickeddd {
UIViewController <SecondViewProtocol>* viewController = [[JSObjection defaultInjector] getObject:@protocol(SecondViewProtocol)];
[viewController configureWithTag:@"从第一个vc跳转过来"];
[self presentViewController:viewController animated:YES completion:nil];
}
@end
//
// SecondViewController.h
// objectionTest
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface SecondViewController : UIViewController
@end
NS_ASSUME_NONNULL_END
//
// SecondViewController.m
// objectionTest
//
#import "SecondViewController.h"
#import "ThirdVCViewController.h"
#import "protocols.h"
@interface SecondViewController ()<SecondViewProtocol>
@property (nonatomic,strong) UILabel * labell;
@property (nonatomic,copy) NSString * labellstring;
@end
@implementation SecondViewController
- (void)configureWithTag:(NSString *)tag {
self.labellstring = tag;
}
- (void)viewDidLoad {
self.title = @"SecondVc";
self.view.backgroundColor = [UIColor whiteColor];
[super viewDidLoad];
self.labell = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 100, 30)];
self.labell.backgroundColor = [UIColor grayColor];
self.labell.text = self.labellstring;
[self.view addSubview:self.labell];
UIButton * button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(100, 200, 50, 50);
[button setTitle:@"到thirdVC" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClickeddd) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)buttonClickeddd {
ThirdVCViewController * third = [[ThirdVCViewController alloc] init];
[self presentViewController:third animated:YES completion:nil];
}
@end
文章浏览阅读189次。概述:虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务运行时数据区域:Java虚拟机在执行Java程序的过程中会把它管理的内存..._java 堆和 native 堆之间来回复制数据
文章浏览阅读1.5k次。在RHEL7&&CentOS7时代,默认的服务通过systemd控制,并通过systemctl命令完成启停。但是并不是所有的服务都可以完美的通过systemctl来控制,比如今天要提到的Auditd编辑audit.rules添加规则后,当然要通过restart服务来重启生效,但是通过systemctl restart auditd就会报如下错误:[root@abc]# syste..._failed to restart auditd.service: operation refused, unit auditd.service may
文章浏览阅读259次。作者:billy版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处中介者模式使用场景优缺点注意事项UML结构图代码实现..._中介者模式
文章浏览阅读552次。题目描述:输入两颗二叉树A,B,判断B是不是A的子结构。题目解析:_{ *t=(bitree )malloc(sizeof(bitnode)); if(!*t) exit(-1); (*t)->data
文章浏览阅读2.6k次。有时候辛辛苦苦写个网站,挂到服务器上一看,CPU给百分百了,这种问题百分之八九十都是因为代码写有问题,而不是因为系统设置的问题,这种问题也比较难排查。但是结合一些工具也可以找到原因的,关于windbg的使用,好像有本关于.net调试的书,大家有兴趣可以看看,网上也有一些帖子,但关于ANTS Profiler的帖子就比较少了,大家也可以下载试用版来帮助解决问题1 准备日志1.1 _排查iis消耗资源语句
文章浏览阅读1.4w次。Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片)前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要求是服务器上的图片(只给出服务器图片路径,从服务器得到图片),前前后后加起来就不好内容了,网上并没有找到处理这种的代码和解决方式,只好自己写了,弄完了来记录下,防止以后再用.首先动手之前整理下思..._项目实体类批量导出到word
文章浏览阅读3.9k次。SparkSql的repartition和coalesceSparkSql 写hive小文件后记repartition(numPartitions:Int)和coalesce(numPartitions:Int,shuffle:Boolean=false)作用:对RDD的分区进行重新划分,repartition内部调用了coalesce,参数shuffle为true例:RDD有N个分区,需要..._spark sql repartition
文章浏览阅读650次。今天总结下帧动画 原理: 对几张图片按照顺序一张一张进行播放,视觉上感觉是连续播放的动画效果。 一.步骤: 1.在res/drawable放入几张图片 2.在res/drawable下新建一个drawable resource file,比如命名为gril_animation.xml,根节点选择animation-list,点击ok 3.编辑gril_animation.xml文件_帧动画 一个drawable
文章浏览阅读858次。一、介绍树莓派综合项目2:智能小车(一)四轮驱动中,实现了代码输入对四个电机的简单控制,本章将使用Python 的图形开发界面的库——Tkinter 模块(Tk 接口),编写本地运行的图形界面,控制小车的前进后退、转向和原地转圈。Tkinter是Python的标准GUI库,Python使用Tkinter可以快速的创建 GUI 应用程序。由于 Tkinter 是内置到 python 的安装包中、只要..._树莓派 例子 交互
文章浏览阅读6.5k次,点赞4次,收藏12次。今天要运行一个项目,首先在初始配置阶段要执行 yarn install 结果出现了下面的报错: 执行 yarn --version报错如下: 执行 yarn version结果如下: 网上查资料的时候看到一篇相关的文章,可以参考解决问题: 这也是我尝试解决问题的思路,这里给出来的说法是,原始的java安装环境里面已经有yarn了,新安装的yarn的环境变量需要放在它前面。 接下来下载yarn,我是在..._yarn install error: could not find or load main class install
文章浏览阅读2.3k次。1.最多显示四行,自动换列 2.均分成3列_div竖着排列
文章浏览阅读323次。 解析几何解析几何有被代数吃掉的趋势,不过就数学系的学生而言,还是应该好好学一下,我大一没有好好学,后来学别的课时总感觉哪里有些不太对劲,后来才发现是自己的数学功底尤其是几何得功底没有打好。1吴光磊《解析几何简明教程》高等教育出版社写的简单明了,我基础没有打好,快速翻了一下这本书收获还是不少的。不过打基础的时候还是从下面三本选一本看,把这本当参考书。2《解析几何》丘维声,北京大...