OC學習:SEL型別資料和selector的用法
阿新 • • 發佈:2019-01-26
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。