OC特有語法 SEL

2021-07-04 04:37:17 字數 2017 閱讀 1443

sel就是對方法的一種包裝。包裝的sel型別資料它對應相應的方法位址,找到方法位址就可以呼叫方法。在記憶體中每個類的方法都儲存在類物件中,每個方法都有乙個與之對應的sel型別的資料,根據乙個sel資料就可以找到對應的方法位址,進而呼叫方法。

@inte***ce person : nsobject 

+ (void

)test1; 

- (void

)test2; 

@end 

// 根據.h檔案中定義的person類和方法 執行完這行** 在記憶體中如下

sel就是對方法的一種包裝。包裝的sel型別資料它對應相應的方法位址,找到方法位址就可以呼叫方法

1.方法的儲存位置

2.sel物件的建立

sel s1 = @selector(test1); 

// 將test1方法包裝成sel物件 

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 

@inte***ce person : nsobject 

- (void

)test1; 

- (void

)test2:(nsstring *)str; 

@end 

/******************************* person.m檔案 **********************************/

#import "person.h"

@implementation person 

- (void

)test1 

- (void

)test2:(nsstring *)str 

@end 

/******************************* main.m檔案 **********************************/

#import "person.h"

#import 

/*呼叫方法有兩種方式:

1.直接通過方法名來呼叫

2.間接的通過sel資料來呼叫

*/int

main(

intargc, 

const

char

* argv) 

尋找方法的過程:

(1)首先把test

這個方法名包裝成

sel型別的資料;

(2)根據sel

資料找到對應的方法位址;

(3)根據方法位址呼叫相應的方法。

(4)注意:

在這個操作過程中有快取,第一次找的時候是乙個乙個的找,非常耗效能,之後再用到的時候就直接使用。

關於_cmd:

每個方法的內部都有乙個

-cmd,

代表著當前方法。

注意:sel其實是對方法的一種包裝,將方法包裝成乙個

sel型別的資料,去尋找對應的方法位址,找到方法位址後就可以呼叫方法。這些都是執行時特性,發訊息就是傳送

sel,然後根據

sel找到位址,呼叫方法。

OC 特有語法1

asp.net unity開發 net培訓 期待與您交流!一 利用點語法替換set方法和get方法 1.方法呼叫 student stu student new stu setage 10 int age stu age 這是set和get的物件呼叫方法 2 點語法 stu.age 10 int a...

OC特有語法 多型

多型 指標以父類型別宣告,但實際執行時指向的是其某個子類的物件,當用這個指標呼叫方法時,會根據其指向的不同子類物件呼叫不同的物件方法。這種現象叫多型。多型的前提是子類會覆蓋父類的方法。多型的應用 需要乙個新的函式專門用來餵狗 void feed dog d 如果這個時候也需要喂貓,那就應該重寫新乙個...

OC特有語法 Block

block 與函式指標的比較 有點像函式指標,可以作為引數傳遞,作為函式返回值 函式指標 void mypoint test 指向函式的指標。儲存函式名代表的指標變數 mypoint block 彌補了指向函式的指標不能夠直接儲存乙個函式體 void myblock 1 定義block變數 int ...