无法从字符串创建我的 CIFilter 类
Posted
技术标签:
【中文标题】无法从字符串创建我的 CIFilter 类【英文标题】:Inability to create my CIFilter classes from string 【发布时间】:2016-11-26 17:57:58 【问题描述】:在我自己创建 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
。
关于如何解决这个问题的任何想法?
【问题讨论】:
【参考方案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];
在 lldb 中,这些检查如下...
【讨论】:
以上是关于无法从字符串创建我的 CIFilter 类的主要内容,如果未能解决你的问题,请参考以下文章
无法使用CIFilter从CIImage中提取UIImage
为啥我收到 CIFilter 的“无法识别的选择器发送到类”错误?
CIFilter 不回答自定义过滤器的 kCIAttributeDescription