一 SEL
1. 方法的存储位置
每个类的方法地址列表都存储在类对象中。
每个方法都有一个与之对应的SEL类型的对象。
根据一个SEL对象就可以找到方法的地址,进而调用方法。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject + (void) test1; - (void) test2; - (void )test3:(NSString *) abc; @end
Person.m
#import "Person.h" @implementation Person + (void)test1{
NSLog(@"调用方法test1 ---\n");
} - (void)test2{
NSLog(@"调用方法test2 ---\n");
} - (void)test3:(NSString *)param1{
NSLog(@"调用方法test3 ---%@", param1);
} @end
main.m
[p test2]; [p performSelector:@selector(test2)];
第1行 第一种方式:直接通过p对象调用test2方法。
第2行 第二种方式:间接调用 test2方法。
1)把test2包装成SEL类型的数据。
2)根据SEL数据找到对应的方法地址。
3)根据方法地址调用对应的方法。
[p test3:@""]; [p performSelector:@selector(test3:) withObject:@""];
第1行:p 类直接调用带参数的方法test3.
第3行: p类间接调用带参数的方法 test3,注意间接调用带参数的方法时,使用 @selector(方法:)的形式调用。
NSString *name = @"test2";
SEL s2 = NSSelectorFromString(name);
NSLog(@"%p" , s);
NSLog(@"%p" , s2);