从《一个不规范的 Category 写法导致的“血案”》说起—检

2020-03-30  本文已影响0人  flexih

前几天有一篇文章一个不规范的 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]
上一篇 下一篇

猜你喜欢

热点阅读