OC語法 OC中特有的語法:SEL基本數據類型

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章