什么时候选择器“直到运行时才知道”?

时间:2014-07-31 11:18:37

标签: objective-c selector

我读了一篇关于Selectors的Apple文档,其中说

  

当您希望代码发送一个在运行时可能不知道其名称的消息时,可以使用从字符串创建的选择器。

我读过“直到运行时才知道”和几个地方的类似短语 - 直到运行时我们才知道什么?如果我正在编码,对我隐藏什么,或者我不知道什么?

我对这个运行时概念感到困惑。

2 个答案:

答案 0 :(得分:0)

运行时表示程序运行时的

相比之下, 运行时意味着Objective-C所依赖的库代码(基本上,所有函数都以{{开头) 1}},objc_class_object_protocol_;即sel_中定义的那些。

因此,文档告诉您,如果您遇到以下情况:配置文件或其他一些数据告诉您需要调用哪个选择器,然后您可以使用从字符串创建的选择器。

答案 1 :(得分:0)

这意味着您可以在运行时确定要运行哪个选择器:

- (void)first
{
}

- (void)second
{
}

- (void)third
{
}

- (void)runSelectorForNumber:(NSInteger)number
{
    NSString *selectorName;
    switch (number) {
    case 1: selectorName = @"first"; break;
    case 2: selectorName = @"second"; break;
    case 3: selectorName = @"third"; break;
    default: NSAssert(NO, @"Bad number!");
    }

    SEL selector = NSSelectorFromString(selectorName);
    [self performSelector:selector withObject:nil afterDelay:0.0];
}

当然,在这个例子中你更有可能这样做:

SEL selector;

然后对每个案例做:

case 1: selector = @selector(first); break;

但是我想通过字符串来展示如何做到这一点,因为这就是您正在阅读的内容。