【问题标题】:Undefined selector with Objective-C runtime - blocks带有 Objective-C 运行时的未定义选择器 - 块
【发布时间】:2023-03-13 05:40:01
【问题描述】:

我正在尝试创建一个函数,让我多次执行相同的操作。这次我决定用一个块去。但是在编写以下代码后:

- (BOOL)readyForProcessing {
    void (^notDeclaredError)(id) = ^(id missingObject) {
        NSString *missingObjectName = NSStringFromSelector(@selector(missingObject));
        NSString *errorDescription = [NSString stringWithFormat:@"You need to provide %@ property", missingObjectName];
        [self configureErrorWithLocalizedDescription:errorDescription];
    };

    if (!self.delegate) notDeclaredError(self.delegate);

    return (self.error == nil);
}

我在声明missingObjectName的行中收到警告。

 Undeclared selector 'missingObject'

我知道它可能会尝试从missingObject 生成NSString 而不是delegate。如何以这种方式传递它,输出将是delegate 并且代码将在块内?

【问题讨论】:

  • 警告你当前类中没有方法-(void) missingObject。你到底想用这条线实现什么?
  • 写if (!self.delegate) notDeclaredError(@"self.delegate"); 会不会更容易——只需将字符串直接传递给块。 `
  • 我正在尝试将属性名称拉到字符串中。我知道有这样的方法,我在问题的最后写了它。我想知道如何提取属性的名称而不是这个 missingObject ivar。
  • 不够动态。稍后将进行大量重构,因为此方法不会用于 1 个属性。更改名称将导致一切无效。最好将NSStringFromSelector 的结果作为参数传递,但我想知道如何在块内进行。
  • 如果 self.delegate 是 nil 那么你将实际执行 notDeclaredError(nil) 因为 self.delegate 将在运行时进行评估,然后再传递给块。

标签: ios objective-c iphone objective-c-blocks objective-c-runtime


【解决方案1】:

你在这里:

- (BOOL)readyForProcessing {
    void (^notDeclaredError)(SEL) = ^(SEL missingObject) {
        NSString *missingObjectName = NSStringFromSelector(missingObject);
        NSString *errorDescription = [NSString stringWithFormat:@"You need to provide %@ property", missingObjectName];
        [self configureErrorWithLocalizedDescription:errorDescription];
    };

    if (!self.delegate) notDeclaredError(@selector(delegate));

    return self.error ? NO : YES;
}

【讨论】:

  • 大声笑,是的,事实^^。谢谢,将在 SOF 允许的情况下在 6 分钟内接受。
  • 请注意:请将错字void (^notDeclaredError)(id) 改成void (^notDeclaredError)(SEL)
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多