在Objective-C中,至少有两种获取(或创建?因此问题)选择器的方法:@selector(foo:bar:)
或NSSelectorFromString(@"foo:bar:")
。但是选择器的生命周期是什么?
由于选择者知道(至少)他们的名字,他们不太可能是固定大小的可复制值,可以在程序周围进行混乱。这意味着有人需要分配并可能解除分配它们。来自Cocoa框架的大多数对象都具有retain-release语义,这使得它们的所有权显而易见并且相对容易跟踪。但是,我认为选择者没有明确的所有权概念。
我希望使用第一种语法获得的选择器在程序的整个生命周期中都可以作为全局变量(如文字字符串),但另一种呢?如果我使用NSSelectorFromString(@"foo:bar:")
创建/获取选择器,它是否也适用于我的程序的整个生命周期?
答案 0 :(得分:6)
这是“得到”,而不是“创造”。这两个只是检索选择器,它由运行时系统创建和拥有。因此,SEL
的有效期实际上是不朽的。
如果您想自己创建一个选择器,则需要使用运行时函数sel_registerName()
。如果您向运行时传递一个尚未知的名称,则NSSelectorFromString()
使用此函数。
答案 1 :(得分:4)
根据Apple的documentation,选择器在全球注册并永远存在。如果您将新的或未知的选择器名称传递给NSSelectorFromString
,它将被注册为新的选择器。