gpt4 book ai didi

ios - 在所有构造函数中不调用 super 的类实例化

转载 作者:行者123 更新时间:2023-11-29 13:10:03 25 4
gpt4 key购买 nike

我有以下情况:我正在扩展 UITextView 控件 (MyTextView : UITextView)。根据运行时设备版本,我有不同的实现。所以目前我在 MyTextView 类的实现中有很多“if-else”语句。

为了使其更易于维护,我想将其拆分为不同的类:

MyTextViewIos5:MyTextViewMyTextViewIos6:MyTextView

创建一个工厂函数,该函数将在运行时知道根据设备 iOS 版本创建哪个子类

如果我使用 MyTextView 作为参数,此解决方案将完美运行。

MyTextView* textView = [Factory createWithFrame:frame];

当有一个继承自 MyTextView (externalTextView:MyTextView) 的类并使用特定方法扩展它时,问题就开始了,它的 initWithFrame 方法将如下所示:

- (id)initWithFrame:(CGRect)frame {
self = [Factory createWithFrame:frame];
if (self) {
...
}
return self;
}

我没有调用 super initwithFrame,而是调用我的工厂。

当我调用 externalTextView 特定方法时,应用程序崩溃并出现错误,即 MyTextViewIos5MyTextViewIos6 未实现调用的特定方法.

是否有解决方法让它工作?

最佳答案

简单地分配 self = [Factory createWithFrame:] 仅为 MyTextViewIos5MyTextViewIos6 初始化数据,而不是您的自定义类。结果,自定义类的方法表等不存在,这就是它崩溃的原因。

继承的本质是,您必须子类化 MyTextViewIos5 MyTextViewIos6 才能继承它们的功能。问题是您不知道是哪个。

我建议将自定义类的功能分离到委托(delegate)/协议(protocol)设计中。 MyTextView 父类(super class)可以包含用于管理委托(delegate)的代码。

类似于:

- (void)methodCustomSubclassWouldHaveOverridden
{
[delegate handleThisForMe];
}

关于ios - 在所有构造函数中不调用 super 的类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com