OC面向對象新增語法:
1、屬性生成器:
@property //聲明屬性
例:
@property (nonatomic,strong) NSString *name;
@synthesize //合成屬性,相當于同時設置了getter方法和setter方法
例:
@synthesize name = _name;
2、分類Category:
- 分類與繼承
- 使用分類擴展類,無需子類化
例:
//Person+LP.h
#import"Person.h"
@interfacePerson(LP)
-(void)study;
@end
//Person+LP.m
#import"Person+LP.h"
@implementationPerson(LP)
-(void)study{
NSLog(@"正在學習----");
}
@end
//main.m
#import<Foundation/Foundation.h>
#import"Person.h"
#import"Person+LP.h"
intmain(intargc,constcharchar*argv[]){
@autoreleasepool{
Person*p1=[[Personalloc]initWithAge:33andName:@"jack"];
NSLog(@"年齡是:%d,名字是:%@",p1.age,p1.name);
//調用分類的方法
[p1study];
}
return0;
}
3、協(xié)議Protocol
- 使用協(xié)議聲明方法
- 協(xié)議類似于C#,Java中的接口
例:
@protocol MyProtocol
-(void)myProtocolMethod;
end
PS:分類,拓展與協(xié)議的區(qū)別
1、分類
適用范圍
當你已經封裝好了一個類(也可能是系統(tǒng)類、第三方庫),不想在改動這個類了,可是隨著程序功能的增加需要在類中增加一個方法,這時我們不必修改主類,只需要給你原來的類增加一個分類。
將一個大型的類拆分成不同的分類,在不同分類中實現類別聲明的方法,這樣可以將一個類的實現寫到多個.m文件中,方便管理和協(xié)同開發(fā)。
分類中的方法可以只聲明,不實現,所以在協(xié)議不支持可選方法的時候(協(xié)議現在已經支持可選方法),通常把分類作為非正式協(xié)議使用。語法格式
文件中的語法
@interface 主類類名(分類類名)
@end
@implementation主類類名(分類類名)
@end
文件名通常為:主類名+分類名
調用方法時,只需要向主類引用放送消息即可注意事項
分類中方法的優(yōu)先級比原來類中的方法高,也就是說,在分類中重寫了原來類中的方法,那么分類中的方法會覆蓋原來類中的方法
分類中只能聲明方法,不能添加屬性變量,在運行時分類中的方法與主類中的方法沒有區(qū)別
通常來講,分類定義在.h文件中,但也可以定義.m文件中,此時分類的方法就變成私有方法如何使用
//定義XYZPopViewController類的分類
//XYZPopViewController+CatController.h文件
@interfaceXYZPopViewController (CatController)
- (void)test;
@end
//XYZPopViewController+CatController.m文件
@implementationXYZPopViewController (CatController)
- (void)test {
NSLog(@"測試一下XYZPopViewController的分類");
}
@end
2、擴展
適用范圍
擴展是分類的一種特殊形式。語法格式**
@interface 主類類名()
@end **
擴展通常定義在主類.m文件中,擴展中聲明的方法直接在主類的.m文件中實現。注意事項
擴展中可以聲明實例變量,可以聲明屬性,因為擴展通常定義在主類的.m文件中,所以擴展聲明的方法和屬性通常是私有的如何使用
//定義XYZPopViewController類的擴展
//方式1、以單獨的文件定義
//XYZPopViewController_ExViewController.h文件
#import"XYZPopViewController.h"
@interfaceXYZPopViewController()
@property(nonatomic,strong)NSString*stringOfEx;
- (void)testEx;@end
//方式2、在主類的.m文件中定義
//XYZPopViewController.m文件
#import"XYZPopViewController.h"
@interfaceXYZPopViewController()
@property(nonatomic,strong)NSString*stringOfEx;
- (void)testEx;
@end
@implementationXYZPopViewController
@end
//在主類的.m文件中實現擴展定的方法
#import"XYZPopViewController.h"
//import"XYZPopViewController_ExViewController.h"
@interfaceXYZPopViewController()
@end
@implementationXYZPopViewController
- (void)testEx {
self.stringOfEx=@"給擴展里面定義的屬性字符串賦值";
NSLog(@"定義的屬性String是:%@",self.stringOfEx);
}
@end
3、協(xié)議
適用范圍
協(xié)議用來制定一個規(guī)則,一個對象遵守某個協(xié)議,就相當于必須遵守它的規(guī)則(實現必須實現的方法),也就擁有了一種能力。通常適用協(xié)議來實現委托代理模式的傳值和消息發(fā)送。語法格式
聲明協(xié)議**
@protocol 協(xié)議名 <>
@required 聲明必須遵守的屬性和方法,默認!
@optional 聲明可選的屬性和方法
@end
**
一個類遵守一個協(xié)議
@interface 類名(分類名):父類名 <協(xié)議名>
@end注意事項
協(xié)議的繼承相當于協(xié)議的合并
一個類可以同時遵守多個協(xié)議,協(xié)議之間用","號分開如果一個類遵守一個協(xié)議,那么它的子類也遵守協(xié)議的使用和多態(tài)相類似,可以用作數組、參數、返回值類型,只不過多態(tài)返回的對象,一定要有繼承關系,協(xié)議類型返回的對象,一定要有遵守協(xié)議或實現協(xié)議。-
如何使用
在一個對象A中定義一個協(xié)議類型的引用,讓這個引用指向實現了協(xié)議或者遵守了協(xié)議的對象B,A對象可以在合適的時候通過這個引用向遵守了協(xié)議的對象B發(fā)送消息(只能發(fā)送協(xié)議要求的消息)。由于對象B遵守協(xié)議,在B中實現了協(xié)議要求的方法,所以當A通過這個協(xié)議類型的引用發(fā)送消息時,B就會執(zhí)行這個方法實現的相關操作。定義一個協(xié)議
#import<Foundation/Foundation.h>
@protocolXYZProtocolDelegate <NSObject>
-(void)changedColor:(UIColor*)color;
@end
//在對象A中定義一個協(xié)議類型的引用
@interfaceXYZPopViewController :UIViewController@property(nonatomic,weak)id<XYZProtocolDelegate> delegate;
@end
//A對象可以在合適的時候通過這個引用向遵守了協(xié)議的對象B發(fā)送消息(點擊button發(fā)送一個消息)
- (void)buttonClick:(UIButton*)button {
[self.delegatechangedColor:[UIColoryellowColor]];
}
//對象B遵守協(xié)議
@interfaceXYZDetailViewController()<XYZProtocolDelegate>
@end
//對象B中實現協(xié)議要求的方法
- (void)changedColor:(UIColor*)color {
self.textView.textColor= color;
}
//在對象B中得到對象A的引用,把A中定義的那個協(xié)議類型的引用指向自身(一般是在B中創(chuàng)建或者初始化A時)
XYZPopViewController*pVC = [[XYZPopViewControlleralloc]init];
pVC.delegate=self;
4、Fundation框架:
- 創(chuàng)建和管理集合,如數組和字典
- 訪問存儲在應用中的圖像和其他資源
- 創(chuàng)建和管理字符串
- 發(fā)布和觀察通知
- 創(chuàng)建日期和時間對象
- 操控URL流
- 異步執(zhí)行代碼
5、新增異常處理
- 用于處理錯誤信息
- 格式:
@try{ }@catch( ){ }@finally{ }
PS:回顧一下C語言的那些內容