標籤:
SEL就是對方法的一種封裝。封裝的SEL類型資料它對應相應的方法地址,找到方法地址就可以調用方法。在記憶體中每個類的方法都儲存在類對象中,每個方法都有一個與之對應的SEL類型的資料,根據一個SEL資料就可以找到對應的方法地址,進而調用方法。
- @interface Person : NSObject
-
- + (void)test1;
- - (void)test2;
- @end
-
- // 根據.h檔案中定義的Person類和方法 執行完這行代碼 在記憶體中如下
- Person *person = [[Person alloc] init];
SEL就是對方法的一種封裝。封裝的SEL類型資料它對應相應的方法地址,找到方法地址就可以調用方法
1.方法的儲存位置
- 在記憶體中每個類的方法都儲存在類對象中
- 每個方法都有一個與之對應的SEL類型的資料
- 根據一個SEL資料就可以找到對應的方法地址,進而調用方法
- SEL類型的定義: typedef struct objc_selector *SEL
2.SEL對象的建立
- SEL s1 = @selector(test1); // 將test1方法封裝成SEL對象
- SEL s2 = NSSelectorFromString(@"test1"); // 將一個字串方法轉換成為SEL對象
3.SEL對象的其他用法
- // 將SEL對象轉換為NSString對象
- NSString *str = NSStringFromSelector(@selector(test));
-
- Person *p = [Person new];
-
- // 調用對象p的test方法
- [p performSelector:@selector(test)];
- /******************************* Person.h檔案 **********************************/
-
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
-
- - (void)test1;
-
- - (void)test2:(NSString *)str;
-
- @end
-
- /******************************* Person.m檔案 **********************************/
-
- #import "Person.h"
-
- @implementation Person
-
- - (void)test1
- {
- NSLog(@"無參數的對象方法");
- }
-
- - (void)test2:(NSString *)str
- {
- NSLog(@"帶有參數的方法%@",str);
- }
- @end
-
- /******************************* main.m檔案 **********************************/
-
- #import "Person.h"
- #import <Foundation/Foundation.h>
-
- /*
- 調用方法有兩種方式:
- 1.直接通過方法名來調用
- 2.間接的通過SEL資料來調用
- */
-
- int main(int argc, const char * argv[])
- {
- Person *person = [[Person alloc] init];
-
- // 1.執行這行代碼的時候會把test2封裝成SEL類型的資料
- // 2.然後根據SEL資料找到對應的方法地址(比較耗效能但系統會有緩衝)
- // 3.在根據方法地址調用對應的方法
-
- [person test1];
-
- // 將方法直接封裝成SEL資料類型來調用 withObject:傳入的參數
- [person performSelector:@selector(test1)];
- [person performSelector:@selector(test2:) withObject:@"傳入參數"];
-
- return 0;
- }
【編輯精選】
- Android和iOS如何防禦惡意應用
- 探秘百度移動面試 iOS試題分享
- iOS7.1正式發布:加入CarPlay車載功能調整部分UI和bug
- 調查顯示開發人員對HTML5的興趣高於iOS?
- iOS基本記憶體管理:autorelease和autoreleasepool
iOS開發 關於SEL的簡單總結