【问题标题】:Inability to create my CIFilter classes from string无法从字符串创建我的 CIFilter 类
【发布时间】: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

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: ios objective-c class cocoa-touch


    【解决方案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 中,这些检查如下...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      相关资源
      最近更新 更多