Xcode 9.2中Fix-It自动生成大量无关协议方法的原因与解决方法
问题分析与解决办法
嘿,我完全懂你的困扰!Xcode 9.2的这个Fix-It功能确实有点“过度热心”,下面给你拆解原因和解决办法:
为什么会生成大量无关方法桩?
主要有两个核心原因:
- 多协议的合并处理逻辑:你的视图控制器扩展同时声明了
CNContactPickerDelegate和MFMessageComposeViewControllerDelegate两个协议。Xcode的Fix-It在处理协议未实现的警告时,会一次性扫描所有已声明但未完全实现的协议,把它们的所有必需方法桩都生成出来——你可能只需要处理MFMessageComposeViewControllerDelegate的方法,但Fix-It会把CNContactPickerDelegate的所有方法也一并生成,看起来就像“无关”内容。 - Xcode 9.2的协议解析bug:这个版本的Xcode在协议继承关系的解析上存在疏漏,有时候会错误地把父类(比如
UITableViewController自带的UITableViewDelegate/UITableViewDataSource)的方法也当成需要补全的内容,导致生成一堆额外的方法桩。
如何阻止这个行为?
给你几个实用的解决方案:
- 手动实现目标协议方法:既然
MFMessageComposeViewControllerDelegate只有一个必需方法,直接手动写出来就行,完全不用依赖Fix-It:- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { // 这里写你的业务逻辑 [controller dismissViewControllerAnimated:YES completion:nil]; } - 拆分协议分步处理:如果一定要用Fix-It,先暂时移除其中一个协议,比如先把代码改成:
点击Fix-It生成需要的方法后,再把@interface TUDiscoverInviteViewController ()<MFMessageComposeViewControllerDelegate> @endCNContactPickerDelegate加回去,之后按需处理它的方法即可。 - 升级Xcode版本:Xcode 9.2是比较旧的版本了,苹果在后续的版本(比如Xcode 10及以上)中修复了很多这类协议解析的bug,Fix-It的准确性会大幅提升,不会再生成多余的方法桩。
- 按需屏蔽不必要的警告:如果某些协议的方法你确实不需要实现,可以通过添加
#pragma clang diagnostic ignored "-Wprotocol"来暂时屏蔽警告(不过不推荐长期这么用,最好还是按需实现必需方法)。
内容的提问来源于stack exchange,提问作者Can Poyrazoğlu
相关产品推荐
相关产品推荐

