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