blog

iOS開発 SELの簡単なまとめ

SEL はメソッドのラッパーです。パッケージ化されたSEL型のデータは、対応するメソッドのアドレスに対応し、メソッドのアドレスを見つけると、メソッドを呼び出すことができます。各クラスのメソッドのメモリ...

Jul 25, 2015 · 3 min. read
シェア
@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; 
} 

Read next

Android ApiDemoサンプル解釈9:アクティビティ->パーシステント

App->Activity- Stateは、Sharedを使ってUIの状態を維持します。Shared Preferenceの作成、変更、使用方法、Sharedは異なるアクティビティ間でデータを共有するために使用します。

Mar 9, 2015 · 2 min read