在object-c运行时替换私有类的方法


ios 有很多私有的类和函数,令人忧伤的是这些官方都不给用,对于一个开发者来说这是相当纠结的一件事。但如果你知道这个私有方法怎么实现的话呢?完全可以自己改写这些私有类和方法,下面以改写UIVebView这个类的一些方法作为例子来说明一下。

UIWebView 了view结构大概如下:

UIWebView:

  _UIWebViewScrollView(其实是scrollview)

  多个UIImageView

  UIWebBrowserView:

    UIWebBrowserViewMinusAccessoryView

 

 UIWebBrowserView 和 _UIWebViewScrollView都是我们不是能直接用的类,UIWebBrowserView下的UIWebBrowserViewMinusAccessoryView直接

的控制着webkit键盘的inputAccessoryView,即图中键盘上面这一栏。假设我们要去掉webkit键盘上面这一栏,自定义为我们自己的样式,应该怎么做呢?

首先要我们要在uiwebview对象中找到UIWebBrowserView的对象,直接遍历就Ok

复制代码
 1 /**
 2   * 找到UIWebBrowserView的对象
 3  */
 4 UIView *browserView = nil;
 5 for (UIView *subview in [[self.subviewsobjectAtIndex:0] subviews]) {
 6      if ([NSStringFromClass([subview class]) hasPrefix:@"UIWebBrowserView"]) {
 7          browserView = subview;
 8           break;
 9       }
10 } 
11 // 拷贝 browserView 中的UIWebBrowserViewMinusAccessoryView
12 Class newClass = objc_duplicateClass(browserView, "UIWebBrowserViewMinusAccessoryView", 0);
13 
14 // 编写自己的实现方法accessoryViewImp
15 IMP accessoryViewImp = [self methodForSelector:@selector(emptyInputAccessoryView)];
16 
17 // 替换系统的inputAccessoryView方法 ,@@: 是type coding ,下面会讲到
18  class_replaceMethod(newClass, @selector(inputAccessoryView), accessoryViewImp, "@@:");
19 
20 //注册类
21 objc_registerClassPair(newClass);
22 
23 //重新设计browserView对象的类
24 object_setClass(browserView, newClass);
25 
26 //载入自己的inputAccessoryView
27 [browserView reloadInputViews];
复制代码

 

一个Object-c的方法实现类型IMP 至少有两个参数self 和 _cmd,如下

复制代码
1 // IMP 类型的自定义方法
2 id emptyInputAccessoryView(id self  , SEL _cmd /*, NSString *str 你的其它参数   */)
3 {  
4        UIView *view = [[[UIView alloc] init] autorelease];
5        //自定义你自己的view  
6        return view;
7 }
复制代码

 

class_replaceMethod方法的最后一个参数是 type encodings ,用来标识IMP函数实现的返回值与参数,其中,

第一个字段@表示返回值是id类型

第二个字段@表示self参数

第三个字段:表示_cmd参数

第四个字段开始为用户定义的参数类型对应的encodings。

具体的type encodings 可以参考apple官方提供的 type encodings 对应表:

Code

Meaning

c

char

i

An int

s

short

l

long

l is treated as a 32-bit quantity on 64-bit programs.

q

long long

C

An unsigned char

I

An unsigned int

S

An unsigned short

L

An unsigned long

Q

An unsigned long long

f

float

d

double

B

A C++ bool or a C99 _Bool

v

void

*

A character string (char *)

@

An object (whether statically typed or typed id)

#

A class object (Class)

:

A method selector (SEL)

[array type]

An array

{name=type...}

A structure

(name=type...)

A union

bnum

A bit field of num bits

^type

A pointer to type

?

An unknown type (among other things, this code is used for function pointers)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值