【发布时间】:2021-11-28 08:11:42
【问题描述】:
其实我的情况是想找一种简洁优雅的风格来调用可选的protocol方法。
当我有这样的协议时:
@protocol SubModuleProtocol <NSObject>
@optional
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
@end
推荐的调用方式是这样的:
id <SubModuleProtocol> subModule = xxx;
if ([subModule respondsToSelector:@selector(scrollViewWillBeginDragging:)]) {
[subModule scrollViewWillBeginDragging:nil];
}
如果协议中有很多方法,我认为这种方法太麻烦了。
所以我想写一个宏来调用。
首先我使用如下宏:
#define SAFECALL(object,sel,func) \
if ([object respondsToSelector:sel]) { \
[object func];\
}
你可以使用:
SAFECALL(subModule, @selector(scrollViewWillBeginDragging:), scrollViewWillBeginDragging:nil);
方式还是有点麻烦。 我想要一个这样的宏:
#define SAFECALL(object,func) \
if ([object respondsToSelector:**Get Selector from func**]) { \
[object func];\
}
可能用c字符串分析可以实现。但是看起来不是很聪明的方法。
那么解决它的最佳方法是什么。或者比使用 marco 更好的方法来进行安全调用。
【问题讨论】:
标签: ios c objective-c macros