SEL基本數據類型
我們OC裏面調用方法有兩種方式比較多:
1:消息機制
2:用SEL基本數據類型
我們先看一下消息機制的工作原理
詳細解釋:
當創建一個對象的時候,就要用到對象當中的isa指針,它使指向類的方法列表的,我們用指針P調用對象的方法時候,其實就是發一個消息給Person對象,那麼這個Person對象去那裏找這個方法呢?沒錯,就是去方法列表裏面去找,那它怎麼去找方法的呢?其實就是指針在發消息的時候進行了一次包裝,包裝成了SEL類型的一個變量,以eat方法爲例,就是把消息包裝成了一個sel的一個變量:SEL s = @selector(eat); 這個變量生成的指針地址(在isa中)就去方法列表裏面去找有沒有這個方法,實際上方法列表裏面的所有方法都是SEL數據類型的。
下面我們看個示例:
給Person類寫了三個方法,一個不帶參數的,一個帶的,一個帶返回值的
main函數
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc]init];
//調用方法有多種方式,下面這種是常用的消息機制,就是說是地址給對象發消息的機制
//[p eat];
//另外一種方式就是:越過發消息這一步,直接找到方法,用SEL數據類型
//使用@selector就能夠把一個方法包裝成SEL數據類型
SEL s2 = @selector(eat);
[p performSelector:s2];
SEL s3 = @selector(call:);
[p performSelector:s3 withObject:@"12312234234"];
SEL s5 = @selector(findName);
NSString *str = [p performSelector:s5];
NSLog(@"str爲:%@",str);
//上面的看懂之後也可以簡寫成下面
[p performSelector:@selector(eat)];
[p performSelector:@selector(call:) withObject:@"123456788"];
NSString *str2 = [p performSelector:@selector(findName)];
NSLog(@"str2 爲:%@",str2);
}
return 0;
}
Person的.h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)eat;
-(void)call:(NSString *)number;
-(NSString *)findName;
@end
Person的.m文件
#import "Person.h"
@implementation Person
-(void)eat
{
NSLog(@"吃東西");
}
-(void)call:(NSString *)number
{
NSLog(@"打電話需要的號碼:%@",number);
}
-(NSString *)findName
{
return @"找到了義哥的名字";
}
@end