復制代碼
@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;
}
復制代碼