1.可以爲已知的類添加方法,哪怕是你沒有源碼的類
2.通過類目添加方法會稱爲原始類的一部分
3.與原類中的方法同級
4.而且會被子類繼承
類目的用處
1.可以擴展別人的類,可以座位子類的替代方式。
2.把同一個類的代碼放到多個文件中,便於多人協作
注意
1.不能在類目中添加 實例變量
2.可以爲同一類添加多個類目,蛋類目名和方法名不能城府
3.不能隨意重寫類的方法
下面我麼來看具體的代碼
類目.h文件
#import
//類目 在類目中不能添加實例變量
@interface NSString (CSayHi)
-(void)sayHi;//類目的方法
@end
類目.m文件
#import "NSString+CSayHi.h"
@implementation NSString (CSayHi)
-(void)sayHi{//類目方法的實現
NSLog(@"這是類目提供的方法,字符內容是%@",self);
}
@end
main函數
#import
#import "NSString+CSayHi.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *str=@"hello";//定義一個字符串對象並賦值
[str sayHi];//調用類目方法
}
return0;
}
二延展
1.延展是一種特殊形式的類目
2.延展中定義的方法在類本身中實現
作用
定義私有方法
注意
延展不寫類目名時,表示嚴重中定義的方法必須實現
如果提供了類目名稱,則可以選擇性實現
下面來看具體代碼
類的.m文件
#import "Student.h"
//延展寫在.m文件上
//延展不提供名稱表示方法必須實現,提供名稱可以不實現
//延展是定義私有方法
@interface Student(sayHi)
-(void)sayHi;//延展的聲明
@end
@implementation Student
@synthesize name;
-(void)sayHi{//延展的實現
NSLog(@"%@打招呼",self.name);
}
-(void)say{
[selfsayHi];
}
@end
main函數
Student *stu=[[Student alloc]init];
stu.name=@"小白";
[stu say];//調用方法
三 協議
協議就是一套標準
協議只聲明瞭方法,不具體實現,接受協議的對象負責實現
oc的協議由@protocol聲明的一組方法列表
要求其他的類去實現,相當於@interface部分的聲明
@protocol 協議名稱
@end
確認協議
定義的協議必須要被某些類實現
類中需要shiixan協議中定義的方法
此過程稱爲確認協議
@interface 類名:父親名<協議名稱,協議名二.....>
@end
注意
確認協議時應實現協議中@required修飾的方法
可以選擇性實現@opyional
使用[對象conformsToProtocol:@protocol(SalerProtocol)]判斷是否遵循協議
代理模式
即本身不做實際的事情,而要求其他人去做
@property(assign,nonatomic)id<協議名>delegate
看實際代碼 我們要求一個學生對服務員制定一個協議
學生類的.h文件
//首先我們創建一個學生的類
#import<Foundation/Foundation.h>
//學生的協議內容的聲明
@protocol roomServer <NSObject>
@required//必須要實現的
-(void)check;//結賬聲明
@optional//不是必須要實現的
-(void)tackClothes;//拿衣服
@end
@interface Student : NSObject
@property(assign,nonatomic)id<roomServer>delegate;//聲明屬性代理()該屬性遵守roomServer協議//
-(void)serve;//聲明方法
@end
學生類的.m文件
#import "Student.h"
@implementation Student
@synthesize delegate;
-(void)serve{
//使用if委託給的對象是否遵守了協議
if([self.delegate conformsToProtocol:@protocol(roomServer)]) {
[self.delegate check];//服務員類的一個(代理)對象調用代理方法
[self.delegate tackClothes];
}
}
//制定一個服務員的類,需要服務員去遵守學生定的協議
服務員的.h
#import<Foundation/Foundation.h>
#import "Student.h"
@interface Waiter : NSObject<roomServer>//把學生的協議引進
@end
服務員的.m文件
學生定的協議要由服務員來施行
#import "Waiter.h"
@implementation Waiter
-(void)check
{
NSLog(@"我給您結賬");
}
-(void)tackClothes
{
NSLog(@"我給您拿衣服");
}
@end
main文件
#import<Foundation/Foundation.h>
#import "Student.h"
#import "Waiter.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu=[[Studentalloc]init];//給Student的stu對象開闢空間並賦初值
Waiter *wa=[[Waiter alloc]init];//非Waiter的wa對象開闢空間並賦初值
stu.delegate=wa;//因爲要用stu對象的代理去執行學生對服務員協議的方法
[stu serve];
}
return0;
}