自己创建this question后,我无法按名称创建自己的UIImageView类,我遇到了类似的问题,这次是CIFilter子类,但是在另一个问题上没有被接受的答案解决。
说,这是问题所在。
我正在创建CIFilter
类的子类,类似于MyEffectFilter1
,MyEffectFilter1
等。
这些子类具有创建特定图像的便捷方法:
+ (instancetype)novo {
MyEffectFilter1 * newFilter = [self filterWithName:...
// do stuff
return newFilter;
}
当我尝试使用字符串
的新命令创建此类时id newObject = [NSClassFromString(nameOfClass) novo];
验证创建的对象,我发现他们的类不是我创建的类,而是CIFilter类。例如:如果我使用我创建的类创建一个漫画过滤器:
// initialization code on MyComicClass.m
+ (instancetype)novo {
MyComicClass * newFilter = [self filterWithName:@"CIComicEffect"];
// do stuff
return newFilter;
}
通过
id newObject = [NSClassFromString(@"MyComicClass") novo];
并执行po newObject
来控制,或使用
Class class = [newObject class];
我的课程等于CIComicEffect
而不是MyComicClass
。
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
在这种情况下,子类构造函数试图调用继承类的便捷构造函数(与之前的问题相反,后者调用了继承的init)。
更改构造函数以执行类似的操作,在self上调用alloc。 CIFilter
提供任何公共initWith...
方法看起来都不像name
这样的属性,可以通过直接调用新实例来轻松设置// MyEffectFilter1.m
+ (instancetype)novo {
MyEffectFilter1 *newFilter = [[self alloc] init];
newFilter.name = @"name";
return newFilter;
}
等属性...
MyEffectFilter1 *filterA = [MyEffectFilter1 novo];
MyEffectFilter1 *filterB = [NSClassFromString(@"MyEffectFilter1") novo];
我测试了以下代码......
{{1}}
在lldb中,这些检查如下......