Mach-O里与方法有关的Load Command有两种类型,LC_MAIN 和 LC_FUNCTION_STARTS。 ####LC_MAIN LC_MAIN是描述可执行文件的入口函数int main(int argc, char * argv[])的,它的定义如下: struct entry_point_command { uint32_t cmd; /* LC_MAIN o...
从《一个不规范的 Category 写法导致的“血案”》说起—检查分类同名方法
前几天有一篇文章一个不规范的 Category 写法导致的“血案”,很有意思。 测试代码如下: //NSObject+Test.h @interface NSObject (Test) - (void)func; @end @implementation NSObject (Test) - (void)func { printf("hello, world"); } @e...
Objective-C二进制瘦身
先说结论:我写了个工具检测无用方法、无用类以及无用协议,只需要Mach-O文件,对Build Setting里的Strip Style无要求,Snake。 Objective-C是采用消息发送的方式来实现类方法的调用。消息发送使用“查表”的方式实现从方法名到方法实现的定位。因此在编译的时候编译器不能确知一个方法是否真的被调用,也就无法像C语言一样只编译使用到的方法。也因此造成了目标二进制里...
iOS如何监测网络请求
iOS10 NSURLSession的delegate NSURLSessionTaskDelegate增加了 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AV...
使用Clang插件
最近在把一个功能模块从一个独立的项目迁入另一个大型项目中,要求这个功能模块只在某一业务的页面上开启。 首先想到的方法是判断一个页面的类是否属于该业务。对于dynamic framework可以通过NSBundle方法判断 + (NSBundle *)bundleForClass:(Class)aClass; 对于static链接的framework或者library无法使用这种方式。 只能...
为iOS点击增加触控反馈
iOS 10增加了触控反馈的类UIFeedbackGenerator及其子类,使得触控反馈不再只能使用私有的sound id。 这里不再赘述触控反馈本身,而是提出一种通用的办法为比如UIButton增加触控反馈。示例代码FeedbackDemo在Github。 UIApplication类有一个方法: func sendAction(_ action: Selector, to target...
通过MachO分析App技术栈
标题里的技术栈特指App里Swift/React Native/Flutter/Weex的应用情况。 ####实现 Swift dyld libs里是否包含libswiftCore.dylib React Native 是否有包含RCTView类 Flutter dyld libs里是否包含Flutter.framework ...
iOS无埋点数据采集实践
无埋点又称全埋点或者零埋点,虽然叫法不一样,想要到达的目的是一样的,即数据收集不再需要hard code,甚至可以做到动态可配要收集的数据。这里不讨论无埋点的方案细节,只探讨实践过程中遇到的几个点。目前看到网上的资料里提出的方案还有提升的空间。下面具体分析一下。 ######1.UITableViewCell的点击事件 UIKIT_EXTERN NSNotificationName con...