一、Category分類
在OC中,對一個類擴充除了使用繼承,還有一種方法是使用Category。分類其實就是在類的聲明和實作後面增加一個括号,括号裡寫上分類名稱。
@interface 類名 (分類名稱)
// 方法聲明
@end
分類的建立方法:
右擊項目,選擇New File,選擇第二項Object-C Category,在Category裡輸入分類的名字,在Category on裡輸入在哪個類上建立分類。
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;
}
可以看到列印出了類名和對象的記憶體位址,這就是列印對象預設的格式。
那如何輸出類的屬性和值呢?
我們在Person.m中重寫- description方法
#import "Person.h"
@implementation Person
- (NSString *)description
{
return [NSString stringWithFormat:@"名字:%@,年齡:%d", _name, _age];
}
@end
三、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:@"我是參數"];
}
運作結果: