#import <Foundation/Foundation.h>
@interface Persion : NSObject
- (void) test;
@end
@implementation Persion
- (void) test{
// _cmd是一个SEL类型的常量,保存当前方法地址。每个方法都内置这个属性
// 如同: SEL _cmd = @selector(test);
NSLog(@"还是SEL牛逼,_cmd:%@", NSStringFromSelector(_cmd));
// [self performSelector:_cmd]; //死循环
}
@end
int main(){
// 1.分配内存
// 除了成员变量,还有SEL类型的属性,保存方法的内存地址
Persion * p = [[Persion alloc] init];
// 2.这里首先把test封装为SEL类型的数据
// 然后到类中匹配已有的SEL数据
// 如果找到了,就根据地址调用
[p test];
// 3.上一步在与类中的SEL数据匹配成功后,会保存一份缓存
// 如果再次调用test,直接从缓存取地址,不再去类中匹配
//这一句,XCode5.1报错:Multiple methods named 'test' dound with mismatched result, parameter type or attributes.
//[p performSelector:@selector(test)]; //下面的分开写却没事了(估计是XCode的bug,因为在终端使用cc运行无误)
SEL s1 = @selector(test);
[p performSelector:s1]; // 但XCode在这里报警:PerformSelector may cause a leak because its selector is unknown
// 如果已知方法名,可以随时切换要调用的方法
NSString * fuc = @"test";
SEL s2 = NSSelectorFromString(fuc);
// [p fuc]; // 这是不行的
[p performSelector:s2]; // XCode报警
return 0;
}
- end