@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));
人物 *p = [Person new];
// オブジェクトpのテスト・メソッドの呼び出し
[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>
/*
メソッドを呼び出すには2つの方法がある:
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;
}