sel就是對方法的一種包裝。包裝的sel型別資料它對應相應的方法位址,找到方法位址就可以呼叫方法。在記憶體中每個類的方法都儲存在類物件中,每個方法都有乙個與之對應的sel型別的資料,根據乙個sel資料就可以找到對應的方法位址,進而呼叫方法。
@inte***ce person : nsobject+ (void
)test1;
- (void
)test2;
@end
// 根據.h檔案中定義的person類和方法 執行完這行** 在記憶體中如下
sel就是對方法的一種包裝。包裝的sel型別資料它對應相應的方法位址,找到方法位址就可以呼叫方法
1.方法的儲存位置
2.sel物件的建立
sel s1 = @selector(test1);3.sel物件的其他用法// 將test1方法包裝成sel物件
sel s2 = nsselectorfromstring(@"test1"
); // 將乙個字串方法轉換成為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 ...