iOS SEL的簡單總結 – iPhone手機開發技術文章 iPhone軟體開發教學課程

復制代碼

@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;

}

復制代碼

發佈留言