OC中如何优化代理是否响应某个方法
看以下示例代码:
1 2 3 4 | if ([_delegate respondsToSelector: @selector (someClassDidSomething:)){ [_delegate someClassDidSomething]; } |
一般情况下,我们在写代理的时候都是这样判断某个对象有没有实现代理中的某个方法。这样固然可以,但是如果某个代理方法调用的频率非常非常高,因为在调用这个代理方法的时候,都需要做一次if判断,if判断的时候又要执行respondsToSelector:方法,所以效率会显得很低下。此时,我们可以采用缓存的办法,来进行优化。
在C语言中有一种乏人问津的特性——可以把结构体中得某个字段在内存中所占用的位数设置为特定的值。
比如:
1 2 3 4 5 6 | struct data{ unsigned int fieldA : 8; unsigned int fieldB : 4; unsigned int fieldC : 2; unsigned int fieldD : 1; }; |
在这个结构体中,fieldA占8位,所以可以表示的范围是0~255,fieldD只占一位,则可以表示的数是0和1。0和1能表示什么,很明显,可以用来表示布尔(BOOL)类型的值。
现在看优化的代码如下:
1 2 3 4 5 6 7 8 | @protocol EOCNetworkFetcherDelegate @optional -( void )networkFetcher:(EOCNetworkFetcher *)fetcher didReceiveData:( NSData *)data; -( void )networkFetcher:(EOCNetworkFetcher *)fetcher didFailError:( NSError *)error; -( void )networkFetcher:(EOCNetworkFetcher *)fetcher didUpdateProgressTo:( float )progress; @end |
优化代码:
1 2 3 4 5 6 7 8 | @interface EOCNetworkFetcher(){ struct { unsigned int didReceiveData : 1; unsigned int didReceiveData : 1; unsigned int didReceiveData : 1; } _delegateFlags; } @end |
在setDelegate中,可以写以下代码,来优化:
1 2 3 4 5 6 | -( void )setDelegate:( id <EOCNetworkFetcher>)delegate{ _delegate = delegate; _delegateFlags.didReceiveData =[delegate respondsToSelector: @selector (networkFetcher:didReceiveData:)]; _delegateFlags.didFailWithError =[delegate respondsToSelector: @selector (networkFetcher:didFailWithError:)]; _delegateFlags.didUpdateProgressTo =[delegate respondsToSelector: @selector (networkFetcher:didUpdateProgressTo:)]; } |
在设置完delegate以后,就可以采用_delegateFlags中的具体标志而不需要每次都调用respondsToSelector:来判断是否响应了某个方法。
1 2 3 | if (_delegateFlags.didUpdateProgressTo){ [_delegate networkFetcher: self didUpdateProgressTo:currentProgress]; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)