从《一个不规范的 Category 写法导致的“血案”》说起—检查分类同名方法

前几天有一篇文章一个不规范的 Category 写法导致的“血案”,很有意思。

测试代码如下:

//NSObject+Test.h
@interface NSObject (Test)

- (void)func;

@end

@implementation NSObject (Test)

- (void)func {
    printf("hello, world");
}

@end

在两个.m文件里引用了NSObject+Test.h,查看Mach-O信息:

Contents of (__DATA_CONST,__objc_catlist) section
0000000100003050 0x100004090 __OBJC_$_CATEGORY_NSObject_$_Test
    name      0x1000015c3 Test
    cls       0x0 _OBJC_CLASS_$_NSObject
    instanceMethods 0x100004058
        entsize 24
        count   2
        name    0x100001638 func
        types   0x100002363 v16@0:8
        imp     0x100000ed0 -[NSObject(Test) func]
        name    0x100001638 func
        types   0x100002363 v16@0:8
        imp     0x100000ea0 -[NSObject(Test) func]

可以看到NSObject只有一个分类,但是有两个同名方法,他们的函数地址不同。两个方法对应两次引用。除了会引起包大小增加,分类同名方法的覆盖(共存)可能因为实现不同,会引起其他逻辑问题,解决这种问题可能会耗费不少时间。

这种情况虽然编译的时候会有警告,但是警告可能会被忽视掉。因此我
Snake 里增加了类重复方法的检测。

snake -d path/to/binary -l path/to/linkmap

-[NSObject(Test)#TCat func]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 说是前言,其实也是本文诞生的目的。随着公司业务的不断增加,功能的快速迭代,app的业务线越来越多,代码体积变...
    梦翔_d674阅读 5,349评论 0 2
  • 大纲 目录1. Category 分类1.1 Category 的使用场合1.2 Category 中都可以添加哪...
    师大小海腾阅读 4,729评论 0 4
  • 面向对象的三大特性:封装、继承、多态 OC内存管理 _strong 引用计数器来控制对象的生命周期。 _weak...
    运气不够技术凑阅读 4,847评论 0 10
  • 面向对象的三大特征,并作简单的介绍。 面向对象的三个基本特征是:封装、继承、多态。 1.封装是面向对象的特征之一,...
    xiny123阅读 5,422评论 0 6
  • 目录:1.Runtime2.NSNotification相关3.RunLoop4.多线程相关5.KVO6.Bloc...
    麦子_KB阅读 4,786评论 0 14

友情链接更多精彩内容