1. 程式人生 > >OC學習:SEL型別資料和selector的用法

OC學習:SEL型別資料和selector的用法


Objective-C中呼叫函式的方法是“訊息傳遞”,這個和普通的函式呼叫的區別是,你可以隨時對一個物件傳遞任何訊息,而不需要在編譯的時候宣告這些方法。所以Objective-C可以在runtime的時候傳遞人和訊息。

一、SEL

 每個SEL型別資料都是一個方法。

SEL就是對方法的一種包裝。包裝的SEL型別資料它對應相應的方法地址,找到方法地址就可以呼叫方法。在記憶體中每個類的方法都儲存在類物件中,每個方法都有一個與之對應的SEL型別的資料,根據一個SEL資料就可以找到對應的方法地址,進而呼叫方法。

注意:

這個過程是有快取的,第一次找SEL對應的方法是逐條找,比較耗效能,但是找過一次之後,便會留下快取資料,再找就直接訪問快取了。

例如,宣告方法:

@interface Person : NSObject 
+ (void)test1; 
- (void)test2; 
- (void)test3:(NSString *)abc;
@end 

實現後,像如下一樣直接呼叫:

Person *person = [[Person alloc] init]; 

[p test1];

二、selector

上例中,也可這樣利用selector來間接呼叫:

[p performSelector: @selector(test2)];

同樣呼叫test3可以這樣:
[p test3: @"123"];

或:
[p performSelector:@selector(test3:) withObject:@"123"];


這樣,我們就可以通過一個方法名字串來呼叫此方法:

NSString *name = @"test2";
SEL s = NSSelectorFromString(name);

[p performSelector:s];

其實每個方法內部都有一個_cmd變數,其是SEL型別變數,代表當前方法。

NSString *str = NSStringFromSelector(_cmd);
NSLog(@"%@",str);

上面的列印語句就是將當前的方法名打印出來,這裡的_cmd其實就相當於@selector(test2)。

所以,其實訊息就是SEL。