UIScrollView、UIView、UILabel、UIImageView修改默认值(runtime、Swizzle)

记录使用runtime修改UIScrollview的经历


今天突然发现一个问题,UITableView中添加的几个按钮,点击后push到其他ViewController中,结果按钮的选中效果不显示,查了一下UIScrollView的API,发现了delaysContentTouches这个属性

@property (nonatomic) BOOL delaysContentTouches;// default is YES. if NO, we immediately call -touchesShouldBegin:withEvent:inContentView:. this has no effect on presses

这个属性默认为YES,也就是会延迟发送touchesShouldbegin这个消息,也就导致了按钮的选中效果没有及时显示出来

那么如何设置一下delaysContentTouches这个属性为NO就好了

_scrollView.delaysContentTouches=NO;

bingo,成功!!!

那么问题来了,项目中有很多的TableView、ScrollView、WebView,挨个的去设置ScrollView的这个属性,未免改动太大,而且风险较高,此时我想到了runtime,那么如何用runtime实现这个效果呢,该写到那个方法中呢?

大家都知道+(void)load和+(void)initialize方法的吧,通俗解释就是load和initialize都是在类加载进内存的时候就会执行,也就是说在main函数调用之前执行。

题外话:load和initialize两个方法都不在main函数的autoreleasepool中,是在main函数之前加载到内存中的,所以,对于这两个方法内初始化的私有变量需要程序员们来处理,怎么处理呢?ARC的话只需要@autoreleasepool封装就好了

我们选择在load中实现,首先因为initialize是在该类或者类对象被调用的时候才会执行,其次,initialize只会调用一次,而且我们要用category实现,类的每一个category类中都会执行各自的load类方法;再者,load我们要对默认值进行修改,应当尽量提前的替换掉方法块才可以

废话不多说,上代码

+ (void)load {

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

                Class class = [self class];

                SEL originInitSel = @selector(initWithFrame:);

                SEL newInitSel = @selector(xxxx_initWithFrame:);

                Method originalMethod = class_getInstanceMethod(class, originInitSel);

                Method swizzledMethod = class_getInstanceMethod(class, newInitSel);

                BOOL didAddMethod =class_addMethod(class,originInitSel,method_getImplementation(swizzledMethod),method_getTypeEncoding(swizzledMethod));

                if (didAddMethod) {

                        class_replaceMethod(class,newInitSel,method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod));

                } else {

                        method_exchangeImplementations(originalMethod, swizzledMethod);

                }

    });

}

/**

重置系统的默认值

让scrollview中的按钮可以随时显示按钮的按下动作

**/

- (id)xxxx_initWithFrame:(CGRect)frame{

        UIScrollView* vscroll = [self xxxx_initWithFrame:frame];///一定要注意这里

        vscroll.delaysContentTouches = NO;

        return vscroll;

}

@end

盗用其他同学的图片:


这是苹果的消息传递的概要原理


这是Swizzle的概要原理

我在这里也描述一下我个人的理解:

1.在编译阶段,llvm会生成一个方法名(字符串、SEL)、类(字符串、class name)和函数指针(IMP)之间的映射表(hashtable)

2.消息传递的概要过程:

    通过方法名(SEL)查找对应的函数指针(IMP)

3.调用方法块(IMP)

那么Swizzle其实就是变更了方法名(SEL)和函数指针(IMP)之间的映射关系。

其实理解起来很简单~不明白的小伙伴可以在评论区交流一下,欢迎拍砖

UIView/UIImageView也可以用类似的方法修改任意的默认值咯


疑问:在我们的iOS开发过程中,如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。做到优化内存,节省资源的效果,这是为什么呢?

我的qq是:58901119 多交流哟~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 739评论 0 3
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,170评论 0 7
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,539评论 33 466
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 726评论 0 2