`
luliangok
  • 浏览: 816377 次
文章分类
社区版块
存档分类
最新评论

[Cocoa]深入浅出Cocoa之 Method Swizzling

 
阅读更多

[Cocoa]深入浅出Cocoa之 Method Swizzling

罗朝辉(http://blog.csdn.net/kesalin)

CC许可,转载请注明出处

在前文深入浅出Cocoa之消息中,我简要介绍了ObjC 中消息的基本情况,包括SEL查找,缓存以及消息转发等。在本文中,我要介绍一个很有趣的技术,Method swizzling,通过这个手法,我们可以动态修改方法的实现,从而达到修改类行为的目的。当然,还有其他办法(如ClassPosing,Category)也可以达到这个目的。ClassPosing 是针对类级别的,是重量级的手法,Category 也差不多,比较重量级,此外 Category 还无法避免下面的递归死循环(如果你的代码出现了如下形式的递归调用,应该考虑一下你的设计,而不是使用在这里介绍的 Method Swizzling 手法,:))。


在前文深入浅出Cocoa之消息中提到,ObjC 中的类(class)和实例(instance)都是对象,类对象有自己的类方法列表,实例对象有自己的实例方法列表,这些方法列表(struct objc_method_list)是存储在 struct objc_class 中的。每个方法列表存储近似 SEL:Method 的对,Method 是一个对象,包含方法的具体实现 impl。由此可知,我们只需要修改 SEL 对应的 Method 的 impl 既可以达到修改消息行为的目的。下面来看代码:

让我们来分析上面代码:
1,首先,区分类方法和实例方法;
2,取得 SEL 对应的 Method;
3,修改 Method 的 impl,在这里是通过交换实现的。

上面的代码是可以工作的,但还不够完善。Apple 10.5 提供了交换 Method 实现的 API:method_exchangeImplementations。下面我们使用这个新 API,并以 NSObject category的形式给出新的实现方式:


代码就不用多解释了,下面我们来看如何使用。先看辅助类Foo:
Foo.h

Foo.m

下面是具体的使用示例:

输出结果为:注意,test 3 中调用了递归调用“自己”的方法,你能理解为什么没有出现死循环么?


rentzsch 写了一个完善的开源类 jrswizzle 来处理 Method Swizzling,如果你在工程中使用到 Method Swizzling 手法,应该优先使用这个类库,:)。


Refference

MethodSwizzlinghttp://www.cocoadev.com/index.pl?ExtendingClasses

jrswizzlehttps://github.com/rentzsch/jrswizzle




分享到:
评论

相关推荐

    深入浅出Cocoa教程

    - [深入浅出Cocoa]之MethodSwizzling - [深入浅出Cocoa]之多线程NSThread - [深入浅出Cocoa]多线程编程之block与dispatchqueue - [深入浅出Cocoa]之Bonjour网络编程 - [深入浅出Cocoa]之Framework - [深入浅出Cocoa]...

    深入浅出讲objective-c

    "深入浅出讲Objective-c"的文档很可能涵盖了这些内容,并可能包含更多关于类设计、异常处理、调试技巧等实际开发中的细节。通过学习这份文档,初学者可以系统地掌握Objective-C的基础知识,并逐步进入iOS和macOS应用...

    苹果开发之Cocoa编程原书第4版

    在苹果开发之Cocoa编程原书第4版中,你将深入学习如何利用Objective-C或Swift语言来构建高效、功能丰富的应用程序。这本书是mac app开发者的宝贵资源,提供了详尽的指导和实践案例。 Cocoa框架由两部分组成:...

    cocoa框架深入了解

    《深入理解Cocoa框架》 Cocoa框架是苹果公司为Mac OS X和iOS操作系统开发应用程序的核心框架,它基于Objective-C语言构建,提供了丰富的组件和工具,使得开发者能够创建功能强大的图形用户界面和复杂的系统交互。...

    Learning Cocoa With Objective-C

    《Learning Cocoa With Objective-C》是一本专为初学者设计的Cocoa编程教程,它深入浅出地介绍了如何在苹果的Mac OS X和iOS平台上开发应用程序。这本书以其丰富的图文并茂的讲解方式,使得复杂的编程概念变得易于...

    cocoa编程之菜鸟入门

    - **高级特性探索**:除了基础知识外,本书还深入探讨了一些Cocoa的高级特性,如Core Data持久化框架、Core Animation动画效果等,帮助读者进一步提升应用的质量。 #### 六、总结与展望 - **总结**:通过本书的...

    Cocoa基本原理指南(Cocoa Fundamentals Guide)

    《Cocoa基本原理指南》是苹果公司为开发者提供的关于Mac OS X和iOS平台应用程序开发的重要文档,它深入讲解了Cocoa框架的基础知识和核心概念。Cocoa是Apple的面向对象的应用程序开发框架,用于构建高性能、高质量的...

    iOS and macOS Performance Tuning Cocoa, Cocoa Touch, Objective-C, and Swift

    《iOS和macOS性能优化:Cocoa,Cocoa Touch,Objective-C和Swift》是一本深入探讨移动设备和桌面操作系统性能提升的专业书籍。本书主要针对苹果的两大操作系统平台,即iOS和macOS,提供了丰富的实践经验和专业指导,...

    苹果开发之Cocoa编程

    本文旨在深入解析iOS开发中的Cocoa框架,为读者提供全面、系统的Cocoa编程学习资料。Cocoa框架是Apple为Mac OS X和iOS提供的软件开发框架之一,它包含了一系列APIs,用于构建应用程序界面和服务。通过本教程的学习,...

    Learn Cocoa on the Mac, 2nd Edition

    - **Cocoa框架的学习路径**:本书将详细介绍Cocoa框架及其运行环境,让读者深入了解如何利用这些强大的工具来构建现代化的应用程序。 #### Hello, World 本章是一个经典的入门章节,通过编写一个简单的“Hello, ...

    cocoa design patterns.pdf

    本书通过对Cocoa框架中的设计模式深入浅出的讲解,提供了对这些设计模式为何存在以及如何应用的深刻理解。书中不但详细介绍了常见的设计模式,如单例模式、委托模式、观察者模式等,还探讨了它们在Cocoa框架中的实现...

    Cocoa 基本原理指南.pdf (中文)

    - **定义与特点**:Cocoa是一个面向对象的应用程序开发环境,主要应用于Mac OS X操作系统之上。它不仅是一组面向对象的软件库集合,同时也是一个运行时环境,为开发者提供了构建高质量应用程序所需的工具与框架。 - ...

    Cocoa基本原理指南

    Cocoa是苹果公司为MacOSX操作系统开发的应用程序框架,其提供了丰富的组件和工具,旨在帮助开发者快速创建出功能丰富、外观独特的应用程序。Cocoa框架基于Objective-C编程语言,这种语言是C语言的超集,并加入了面向...

    苹果开发之Cocoa编程(第三版)(中文版)

    Cocoa编程是苹果平台应用程序开发的核心技术,尤其在Mac OS X和iOS系统中扮演着至关重要的角色。...通过深入学习并实践书中的内容,你将能够利用Cocoa的强大功能,创造出功能丰富、用户体验优秀的应用。

Global site tag (gtag.js) - Google Analytics