上篇博客我们类比着Java的Spring框架中的依赖注入的实现方式,也试着使用Objective-C来写了一下OC中的依赖注入的实现方式。当然,我们是使用的PList文件来加载的依赖注入时用到的依赖关系。本篇博客我们就来实现一下OC中的AOP编程。上篇博客我们对AOP(Aspect Oriented Programming)进行了简单的介绍,说白了,AOP编程就是在运行时动态的将代码切入到类的指定方法、指定位置上的编程方式。

当然,是使用运行时动态的去实现的,所以被插入代码的一方是在不知情的情况下被插入的。换句话说,AOP编程就是在不改变原有类的结构,来动态的为类添加代码片段。之前我们在《iOS开发之Runtime常用示例总结》中的方法交换的部分,提到过AOP编程。也就是说,我们可以使用Objective-C的Runtime中的方法交换来实现AOP编程。

本篇博客会简单的通过一个DEMO来看一下如果通过方法交换来实现AOP编程。当然在Github上有专门关于OC的AOP的开源库,如Aspects。Aspects主要提供了两个方法来切入相应的代码实现,具体请移步于github相应的内容。

一、示例概述

本篇博客的示例比较简单,其实就是使用Runtime的方法交换来实现AOP面向切面编程。下方这两个文件就是我们本篇博客所涉及的核心文件。TestClass顾名思义就是我们的测试类,而TestClass+Logging就是TestClass的切片,TestClass+Logging会在TestClass不知情的情况下做一些事情。

  

下方代码段就是TestClass类中的测试方法,该方法是非常简单的,只有一行输出语句

  

下方是未添加切片时的运行结果,是比较正常的,如下所示:

  

二、创建切片

接下来我们来创建切片,我们就在TestClass的类目中创建相应的切片。切片实现本质就是讲切入点的方法实现与切片中的方法进行交换。接下来我们就来实现这一过程,其实下方的代码在我们之前聊Runtime的时候就已经聊过了。今天的主题不是Rumtime, 而是AOP, 所以关于Runtime的东西在此就不做过多赘述了。

下方就是本篇博客实现AOP的核心代码:方法交换。

  

下方就是在TestClass中的类目中调用方法交换要做的事情。首先在load()方法中调用方法交换的方法,将切入点testMethod()方法与我们添加的新的方法logTestMethod()进行交换,然后在我们新的方法中调用logTestMethod()。因为testMethod()与logTestMethod()方法的方法实现以及交换了,调用testMethod()即为调用logTestMethod()方法的实现,而调用logTestMethod()方法时,则调用testMethod()方法的实现。

当然这一块比较绕,不过好好捋捋还是不难搞明白的。

  

三、切片运行结果

添加完上述切片后,我们再次调用TestClass对象的testMethod()方法时就会先调用before()方法,然后执行testMethod()原有的方法体,然后执行after()方法。运行效果如下所示。

  

当然本篇博客的内容比较简单,但是还是比较有意思的。关于OC中更全面的AOP的实现请移步于Github上的第三方库Aspects。当然Aspects也是由OC写的,并在github上可以找到其相应的代码实现,有兴趣的可以去看看。

本篇博客所涉及Demo的github下载链接:https://github.com/lizelu/AspectOrientedForiOS

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 }

ObjC中的AOP--面向切面编程的更多相关文章

  1. 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介

    仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...

  2. AOP(面向切面编程)大概了解一下

    前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 1. 概述 在软件业, ...

  3. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  4. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  5. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  6. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  7. C# AOP 面向切面编程之 调用拦截

    有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...

  8. 【原创】Android AOP面向切面编程AspectJ

    一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...

  9. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

随机推荐

  1. MVC下form表单一次上传多种类型的图片(每种类型的图片可以上传多张)

    form表单一次上传多种类型的图片(每种类型的图片可以上传多张) controller中的action方法 public ActionResult UploadImage( )        { in ...

  2. EntityFramework Core 1.1有哪些新特性呢?我们需要知道

    前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework C ...

  3. 第二章:在HTML中使用JavaScript

    1:在使用<script>嵌入JavaScript代码死,记住不要在代码中的任何地方出现"</script>"字符串 例如,浏览器在加载下面所示代码时就会产 ...

  4. C++源码的调用图生成

    前言 之前受知乎用户mailto1587启发,写了个C++源码的调用图生成器,可以以图示法显示C++函数的调用关系, 代码放在了github仓库里,仅供参考: CodeSnippet/python/S ...

  5. Linux驱动技术(七) _内核定时器与延迟工作

    内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行.实际上,时钟中断处理程 ...

  6. react native 添加第三方插件react-native-orientation(横竖屏设置功能 android)

    Installation 1.install  rnpm Run  npm install -g rnpm 2.via rnpm Run rnpm install react-native-orien ...

  7. iOS详解MMDrawerController抽屉效果(一)

      提前说好,本文绝对不是教你如何使用MMDrawerController这个第三方库,因为那太多人写了 ,也太简单了.这篇文章主要带你分析MMDrawerController是怎么实现抽屉效果,明白 ...

  8. Bootstrap框架的要点--栅格系统

    不同的公司要求使用框架有所不同,而Bootstrap框架在工作中使用频次较高,其中栅格系统在这一框架中的地位不容小觑,下面我们开始聊聊它吧. 简单介绍: Bootstrap提供了一套响应式.移动设备优 ...

  9. HDU 4256 The Famous Clock

    The Famous Clock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. js设计模式--单体模式

    GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自<松本行弘的程序世界>). ...