无法从字符串创建我的 CIFilter 类

Posted

技术标签:

【中文标题】无法从字符串创建我的 CIFilter 类【英文标题】:Inability to create my CIFilter classes from string 【发布时间】:2016-11-26 17:57:58 【问题描述】:

在我自己创建 this question 关于无法按名称创建自己的 UIImageView 类之后,我面临着类似的问题,这次是 CIFilter 子类没有被其他问题的接受答案解决。

说了,这就是问题所在。

我正在创建 CIFilter 类的子类,例如 MyEffectFilter1MyEffectFilter1 等。

这些子类具有创建特定图像的便捷方法:

+ (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

从检索到的资产中删除 CIFilter

无法创建令牌:不推荐从字符串隐式转换键。请使用 InMemory 或 LocalFileReference 类

CIFilter(CIStripesGenerator)与SKTexture?