文档章节

iOS Swizzle

Ethan-GOGO
 Ethan-GOGO
发布于 2015/12/28 16:52
字数 158
阅读 44
收藏 0

利用运行时函数runtime交换2个方法的实现

+(void)load //第一次载入内存时候实现load方法
{ 

  //  class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) 对象方法
  //   class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) 类方法
  
    Method method1 = class_getClassMethod(self, @selector(imageNamed:));
    Method method2 = class_getClassMethod(self, @selector(imageWithName:));
    
    method_exchangeImplementations(method1, method2); 
}


1.保证NSMutableArray addobject对象不为空

+(void)load
{    
//直接[NSMutableArray class] 底层无法识别
    Method method1 = class_getClassMethod(NSClassFromString(@"__NSArrayM"), @selector(hm_addObject:));
    Method method2 = class_getClassMethod(NSClassFromString(@"__NSArrayM"), @selector(addObject:));
    
    method_exchangeImplementations(method1, method2);
    
}

+(void)wt_addObject:(id)object
{
    if (object != nil) {
        [self wt_addObject:object];
    }
}


2.防止数组越界

+(void)load
{
    Method method1 = class_getClassMethod(NSClassFromString(@"__NSArrayI"), @selector(wt_objectAtIndex:));
    Method method2 = class_getClassMethod(NSClassFromString(@"__NSArrayI"), @selector(objectAtIndex:));
    
    method_exchangeImplementations(method1, method2);
    
}

+(void)wt_objectAtIndex:(NSUInteger)index
{
    if (index < self.count) {
        return [self wt_objectAtIndex:index];
    }else{
        return nil;
    }
}


© 著作权归作者所有

上一篇: Runtime
下一篇: JS的DOM操作Demo
Ethan-GOGO
粉丝 13
博文 174
码字总数 82033
作品 0
广州
私信 提问
one-stop-shop for all your method swizzling needs

JRSwizzle Description JRSwizzle is source code package that offers a single, easy, correct+consistent interface for exchanging Objective-C method implementations ("method swizzl......

mingxun
2014/04/27
0
0
【逐渐提高】ios 代码库 集合类

系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错~ BlocksKit 将Block风格带入UIKit和Founcation cocoa-helpers 一些Cocoa的扩展 2年前的工程 Coconu...

创意总监
2014/08/30
0
1
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
苹果发布 iOS 9.2 正式版:多项功能增强、改进

除了发布 OS X 10.11.2 和 tvOS 9.1 正式版外,苹果今天还发布了 iOS 9.2 正式版。iOS 9.2 是自 iOS 9 在今年9月发布之后的第二次重大版本更新。iOS 9.2 测试开始于10月底,开发者和公测用户...

oschina
2015/12/09
3.8K
22
IOS学习,最简单的表格应用程序,学习,列出博客

IOS编程浅蓝教程,这是博客地址http://www.cnblogs.com/haichao/category/425378.html IOS编程浅蓝教程:锲子 IOS编程浅蓝教程(一)先决条件:开始iOS编程的必要准备 IOS编程浅蓝教程(二) Hel...

andy521zhu
2015/01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

texlive安装

Installing to: D:/bin/texlive/texlive/2019Installing [001/307, time/total: ??:??/??:??]: adobemapping [2130k]Installing [002/307, time/total: 00:03/08:57]: ae [84k]Installing......

MtrS
24分钟前
2
0
运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
今天
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
3
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部