天天看點

OC學習筆記六---OC特有文法二

一、Category分類

在OC中,對一個類擴充除了使用繼承,還有一種方法是使用Category。分類其實就是在類的聲明和實作後面增加一個括号,括号裡寫上分類名稱。

@interface 類名 (分類名稱)
// 方法聲明
@end           

 分類的建立方法:

右擊項目,選擇New File,選擇第二項Object-C Category,在Category裡輸入分類的名字,在Category on裡輸入在哪個類上建立分類。

OC學習筆記六---OC特有文法二
OC學習筆記六---OC特有文法二

Category的好處是可以将一個很大的類分子產品或者分工編寫,使得這個類的結構更清晰。Category還可以用于給系統函數添加類方法和對象方法。

使用Category的時候要注意:

1)Category可以通路原始類的執行個體變量,但不能添加變量,隻能添加方法。如果想添加變量,可以考慮通過繼承建立子類

2)Category可以實作原始類的方法,但不推薦這麼做,因為它是直接替換掉原來的方法,這麼做的後果是再也不能通路原來的方法

3)多個Category中如果實作了相同的方法,隻有最後一個參與編譯的才會有效

二、description方法

使用NSLog和%@輸出類和對象時,會調用類和對象的+description方法和-description方法。這個方法相當于Java語言中的toString方法,

建立一個Person類,直接列印出對象。

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc] init];
    p.age = 20;
    p.name = @"alin";
    NSLog(@"%@", p);
    return 0;
}           
OC學習筆記六---OC特有文法二

可以看到列印出了類名和對象的記憶體位址,這就是列印對象預設的格式。

那如何輸出類的屬性和值呢?

我們在Person.m中重寫- description方法

#import "Person.h"
 
@implementation Person
- (NSString *)description
{
    return [NSString stringWithFormat:@"名字:%@,年齡:%d", _name, _age];
}
@end           
OC學習筆記六---OC特有文法二

三、SEL

SEL是一種資料類型。

OC調用方法時,并不是直接在類中根據方法名來找。而是把方法名包裝成SEL類型的資料,根據SEL找到對應的方法位址,最後根據方法位址調用方法。

使用[p performSelector:@selector(test1)];可以執行test1方法。

@selector将方法名test1包裝成SEL類型。

performSelector傳入SEL類型的資料執行方法。

帶參數的SEL:

[p performSelector:@selector(test2:) withObject:@"我是參數"];

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(@"----test1");
}
- (void)test2:(NSString *)str
{
    NSLog(@"test3-----%@",str);
}
@end           

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
    Person *p = [Person new];
    [p performSelector:@selector(test1)];
    [p performSelector:@selector(test2:) withObject:@"我是參數"];
}           

運作結果:

OC學習筆記六---OC特有文法二