協議 協議只有方法的聲明(類似於其他編程語言的介面) 協議相當於大家都所遵循的 關鍵字 @protocol 協議名 <所遵循的協議> 預設NSObject @end @protocollamcoProtocol <NSObject>@required //必須實現的方法 -(void)study;@
協議 |
@required //必須實現的方法
-(void)study;
@optional //可實現可不實現的方法
-(void)work; @end student.h文件 #import<Foundation/Foundation.h> #import"lamcoProtocol.h" @interfaceStudeny :NSObject<lamcoProtocol,bank>
@end student.m文件 #import"Studeny.h"
@implementationStudeny
-(void)study{
NSLog(@"%s",__func__);
}
//-(void)work{
// NSLog(@"%s",__func__); //} @end 主函數: #import<Foundation/Foundation.h>
#import"Studeny.h" #import"OtherStudent.h" intmain(intargc,constchar* argv[]) {
@autoreleasepool{
Studeny*stu=[[Studenyalloc]init];
// [stu study]; //判斷其是否遵循協議 if([stuconformsToProtocol:@protocol(lamcoProtocol)]) {
//判斷協議是否有該方法
if([sturespondsToSelector:@selector(study)]){
[stustudy];
// [stu work];
}else{
NSLog(@"找不到好工作");
}
}else{
NSLog(@"沒有參加培訓");
}
if([stuconformsToProtocol:@protocol(lamcoProtocol)]){
if([sturespondsToSelector:@selector(giveMoney)]) {
NSLog(@"每月還錢");
}else{
NSLog(@"成為黑戶");
}
}else{
NSLog(@"不關事");
}
}
return0; }
延展 |
#import"MyClass.h"
@interfaceMyClass()
-(void)add; @end 類文件:Myclass.h #import<Foundation/Foundation.h>
@interfaceMyClass :NSObject
-(void)select;
@end Myclass.m #import"MyClass.h"
@implementationMyClass
-(void)select{
NSLog(@"%s",__func__);
}
-(void)add{
NSLog(@"%s",__func__);
} @end 主函數 main.m #import<Foundation/Foundation.h> #import"MyClass.h" //到導入延展的頭文件 #import"MyClass_add.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
MyClass*class=[[MyClassalloc]init];
[classselect];
[classadd];
}
return0; }
分類(類目) |
#import<Foundation/Foundation.h>
#import"NSString+CategoryNSString.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
NSString*str=@"abc";
NSLog(@"%@", [str Reverser]);
NSLog(@"%d",[str leng].intValue);
}
return0;
} 類目文件:NSString+CategoryNSString.h#import<Foundation/Foundation.h>
@interfaceNSString (CategoryNSString)
-(NSString*)Reverser;
-(NSNumber*)leng;
@end 類目文件:NSString+CategoryNSString.m#import"NSString+CategoryNSString.h"
@implementationNSString (CategoryNSString)
/**
* 字元串反轉函數
*
* @param string傳入的字元串
*
* @return逆序後的字元串
*/
-(NSString*)Reverser{
NSMutableString*str=[NSMutableStringstring];
for(unsignedlongi=(self.length); i>0; i--) {
[strappendFormat:@"%c",[selfcharacterAtIndex:i-1]];
}
returnstr;
}
/**
* 把字元串長度int類型變成NSNumber類型
*
* @param string出入的字元串
*
* @return NSNumber,字元串的長度
*/
-(NSNumber*)leng{
NSNumber*num=[[NSNumberalloc]initWithUnsignedLong:self.length];
returnnum;
}
@end 類目的優化 把所有的分類都放到一個分類中MyClass.h #import<Foundation/Foundation.h>@interfaceMyClass :NSObject
-(void)Select;
@end
@interfaceMyClass (CategoryUpdate)
-(void)update;
@end
@interfaceMyClass (CategoryAdd)
-(void)add;
@end
@interfaceMyClass (CategoryDeleta)
-(void)delect; @end MyClass.m文件 #import"MyClass.h" @implementationMyClass
-(void)Select{
NSLog(@"%s",__func__);
} @end MyClass+CategoryAdd.m文件 #import"MyClass.h"
@implementationMyClass (CategoryAdd)
-(void)add{
NSLog(@"%s",__func__);
} @end MyClass+CategoryUpdate.m文件 #import"MyClass.h"
@implementationMyClass (CategoryUpdate)
-(void)update{
NSLog(@"修改");
} @end MyClass+CategoryDeleta.m文件 #import"MyClass.h"
@implementationMyClass (CategoryDeleta)
-(void)delect{
NSLog(@"刪除");
} @end 總結:1.為了避免更多的代碼,和類目的擴展,把類目的.h文件中全部放在要擴展的類中,並且把他們對應的.h文件刪除 2.第二步把類目中相之對應的.m文件,把他們的 #import"MyClass+CategoryDeleta” 全部改成本來的類 如:#import "MyClass.h" 就可以了