本章主要講解OC語言特性
OC語言中的類目機制只有一個作用:為任何一個類添加方法
現在我們創建一個Student類
@interface Student : NSObject
@property(nonatomic,strong)NSString * name;
@end
@implementation
@end
如果想為Student類添加一個方法,現在有兩種方法
在無法獲取類的源碼且需要給一個類添加方法的情況下,類目的作用就非常重要了。
創建類目的語法也非常簡單,代碼如下
@interface Student (Test)
-(void)test;
@end
@implementation Student (Test)
-(void)test
{
NSLog(@"這裡是Student類目的test方法");
}
@end
聲明和實現的關鍵字都和之前一樣。
不同的是,聲明時候不需要指定父類,而是直接寫要添加方法的類的名字,但後面一定要加一個括號,且括號裡面寫上類目名字。一個類可以有多個類目。
有了這個類目之後,雖然Student類的源碼中沒有test方法,但仍然可以正常用Student對象去調用這個方法。
Student * s = [[Student alloc] init];
[s test];
延展可以看作是一種匿名的類目,類有時需要一些只為自己所見,所用的私有方法這種私有方法可以通過延展的方式來聲明。
比如上文中的Student類有一個作弊的方法,不像被外界看得,但有不影響本身調用。這個方法就可以聲明在延展內,而方法的實現仍然在Student的類內。
@interface Student ()
-(void)zuobi;
@end
通常我們會將類的聲明放在擴展名為.h的文件內,實現放在擴展名為.m的文件內。在生產的可執行文件包種.m文件會被編譯加密成.a文件,且不可逆轉。
Student.h文件
@interface Student : NSObject
@property(nonatomic,strong)NSString * name;
@end
Student.m 文件
@interface Student ()
-(void)zuobi;
@end
@implementation Student (Test)
-(void)test
{
NSLog(@"這裡是Student類目的test方法");
}
-(void)zuobi
{
NSLog(@"正在作弊");
}
@end
通常將延展的聲明也放在.m文件中,這樣便可以隱藏類的方法,不被外界所發現且類內可以正常使用。
OC中的協議為一組方法的聲明。不需要實現。遵守協議的類負責實現協議中的方法。
協議使用@protocol
關鍵字進行聲明。
其聲明的方法中分為必須實現的方法和可選實現的方法。分別用@required
和@optional
關鍵字標示。
如果不寫默認為必須實現的方法。
@protocol Test
@required
-(void)fun1;//遵守該協議的類,必須實現的方法
@optional
-(void)fun2;//遵守該協議的類,可選實現的方法
@end
制定協議很簡單,我們可以通過協議去規定一個對象的行為。
例如下面的方法
-(void)test:(id)obj;
這個方法便要求,obj
對象必須是遵守Test協議的類創建的對象。
@property id obj;
同樣,屬性對象也可以用協議進行規定。