2012-10-29 14 views
3

在Objective-C中,至少有兩種方法可以獲取(或創建?因此是問題)選擇器:@selector(foo:bar:)NSSelectorFromString(@"foo:bar:")。但是選擇者的壽命是多少?選擇器的壽命是多少?

由於選擇器知道(至少)他們的名字,他們不太可能是一個可複製的固定大小的可複製值,可以在程序周圍混洗。這意味着有人需要分配並可能釋放它們。 Cocoa框架中的大多數對象都具有保留髮布語義,這使得它們的所有權更加明確,並且相對容易跟蹤。但是,我看不出有關選擇器所有權的明確概念。

我期望用第一種語法獲得的選擇器在程序的整個生命週期(比如文字字符串)中都是全局的,但另一個呢?如果我使用NSSelectorFromString(@"foo:bar:")創建/獲取選擇器,它是否也適用於我的程序的整個生命週期?

回答

6

這是「得到」,而不是「創造」。這兩個簡單的檢索選擇器,它由運行時系統創建和擁有。因此SEL的一生實際上是不朽的。

如果您想自己創建選擇器,則需要使用運行時功能sel_registerName()。如果您傳遞給運行時尚未知的名稱,則此函數由NSSelectorFromString()使用。

+0

不正確。 'NSSelectorFromString'被記錄爲調用'sel_registerName'。 –

+3

如何「缺件」而不是「不正確」? –

+0

你的答案是「這兩個簡單*檢索*選擇器」。這是不正確的。其中之一被記錄爲在必要時創建選擇器。 –

4

根據蘋果公司的documentation,選擇器在全球註冊並永久生存。如果您將新的或未知的選擇器名稱傳遞給NSSelectorFromString,它將被註冊爲新的選擇器。

相關問題