如何编写类似UITableViewController的自动生成代码桩的基类
实现子类继承基类自动生成代码桩与警告的方案
在Objective-C中没有原生抽象类机制,但可以通过协议+基类默认实现结合自定义Xcode模板的方式,实现类似UITableViewController的自动代码生成效果,具体方案如下:
1. 协议+基类模拟抽象方法(强制子类实现)
先通过协议声明需要子类实现的方法,再在基类中编写这些方法的默认实现,加入警告提示和断言,确保子类必须重写:
// 声明必要方法的协议 @protocol BaseClassRequiredMethods <NSObject> - (int)thisNeedsToBeImplemented; @end // 基类定义 @interface BaseClass : NSObject <BaseClassRequiredMethods> @end @implementation BaseClass - (int)thisNeedsToBeImplemented { #warning Incomplete implementation, return the int value needed. // 运行时强制检查,未重写则崩溃提示 NSAssert(NO, @"子类必须重写此方法"); return 0; } @end
子类继承BaseClass后,若未重写该方法,编译时会看到警告,运行时触发断言崩溃,强制开发者实现。
2. 自定义Xcode模板实现自动生成代码桩
要让子类创建时自动生成方法代码桩,需要修改Xcode的类模板:
- 找到Xcode默认模板目录:
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/Source/Objective-C Class.xctemplate - 复制一份模板并重命名(比如
BaseClass Subclass.xctemplate) - 修改模板内的
___FILEBASENAME___.m文件,添加需要自动生成的方法桩:
@implementation ___FILEBASENAMEASIDENTIFIER___ - (int)thisNeedsToBeImplemented { #warning Incomplete implementation, return the int value needed. return 0; } @end
- 调整
TemplateInfo.plist,设置模板的显示名称和基类关联,之后通过Xcode新建文件时选择自定义模板,就能自动生成带警告的方法桩。
3. 运行时检查强化约束
在基类的初始化方法中,通过运行时API遍历协议方法,检查子类是否实现,未实现则打印警告或触发断言:
- (instancetype)init { self = [super init]; if (self) { Protocol *requiredProto = @protocol(BaseClassRequiredMethods); unsigned int methodCount; struct objc_method_description *methodDescs = protocol_copyMethodDescriptionList(requiredProto, YES, YES, &methodCount); for (NSUInteger i = 0; i < methodCount; i++) { SEL methodSel = methodDescs[i].name; if (![self respondsToSelector:methodSel]) { NSLog(@"⚠️ 警告:子类未实现必要方法 - %@", NSStringFromSelector(methodSel)); NSAssert(NO, @"子类必须实现方法:%@", NSStringFromSelector(methodSel)); } } free(methodDescs); } return self; }
内容的提问来源于stack exchange,提问作者rnorvil
相关产品推荐
相关产品推荐

