復制代碼
@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方法轉換為NSString對象 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; } 復制代碼