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

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

作者: flexih | 来源:发表于2020-03-30 19:18 被阅读0次

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/jjtbuhtx.html