Objective-C中類和方法的定義以及協(xié)議的使用
類和方法的定義
一般類都是繼承NSObject,新建一個(gè)類時(shí)父類選擇NSObject即可,oc只有單繼承,沒有多繼承。
下面以一個(gè)簡(jiǎn)單的oc工程來講解(需配置好Xcode工具以相應(yīng)的SDK),會(huì)建工程的請(qǐng)直接跳到‘六'步驟。
一、新建一個(gè)oc編譯環(huán)境,打開xcode->File->New->Project(快捷鍵 command+shift+N)。
二、選擇OS X--Application--Command Line Tool,選擇next
三、填寫項(xiàng)目名稱(最好英文),你自己的名字,和公司的標(biāo)志。Type選擇Foundation,下面的勾表示是否選擇ARC,建議初學(xué)者勾上。點(diǎn)擊next
四、此時(shí)工程建好了,會(huì)看到一個(gè)main.m文件,所有的調(diào)用都在main.m中完成。
新建一個(gè)類,command+N,選擇父類NSObject,取名people
五、點(diǎn)擊next之后,出現(xiàn)以下界面,切記下面的√要打上。否則在編譯時(shí)工程搜索不到此文件,會(huì)出現(xiàn)編譯錯(cuò)誤。
六、在people.h文件interface中添加變量,NSString為OC的字符串變量。
@interface Person : NSObject {
NSString * _name;
int _age;
}
然后在{}外面定義變量的初始化方法和set方法,格式:-(類型)方法名:(參數(shù)類型)參數(shù)1 參數(shù)名:(參數(shù)類型)參數(shù)2……,set方法名一般為set變量名,變量名首字母大寫,此未蘋果官方文檔上的說明
-(void)setAge:(int)age;
-(void)setName:(NSString *)name;
定義變量的get方法,get方法名同樣為get變量名
-(int)age;
-(NSString *)name;
七、在people.m文件中實(shí)現(xiàn)people.h文件中聲明的方法。
-(void)setAge:(int)age {
_age = age;
}
-(void)setName:(NSString *)name {
_name = [name copy];//copy方法涉及到oc的內(nèi)存管理機(jī)制。使用copy可防止內(nèi)存泄露
}
-(int)age {
return _age;
}
-(NSString *)name {
return _name;
}
七、在main.m中定義一個(gè)people類,并對(duì)其屬性變量進(jìn)行初始化。
定義一個(gè)people類:
Person *dwight = [[Person alloc] init];
給其屬性賦值:
[dwight setName:@"Dwight Schrute"];
[dwight setAge:38];
打印值:
NSLog(@"%@ (%d)", [dwight name], [dwight age]);
PS:一般NSString,NSArray,NSDictionary,NSData等類型的值打印用%@,int等C中的類型,按照C語(yǔ)言打印的關(guān)鍵字打印,NSInteger,NSNumber打印時(shí)用%d。
打印結(jié)果:
protocol協(xié)議,設(shè)置代理
協(xié)議(protocol)是ObjC中很重要的一部分,它用來定義可由任何其他類完成的方法,當(dāng)本類中需要完成某些功能時(shí),可由protocol來實(shí)現(xiàn)
protocol在三種情況中需要用到:
需要聲明別的類期望完成的方法時(shí)
在隱藏自身類的情況下聲明該類對(duì)象的接口時(shí)
在某些沒有繼承關(guān)系的類之間獲取其之間的相似性,即兩個(gè)類之間沒有繼承關(guān)系,但是都需要實(shí)現(xiàn)同樣的方法時(shí),就可通過代理來實(shí)現(xiàn)。
protocol文件中只是定義一些方法,當(dāng)你在類中實(shí)現(xiàn)了這個(gè)protocol時(shí),你就需要補(bǔ)充這些方法,系統(tǒng)會(huì)自動(dòng)調(diào)用這些方法
protocol中方法分為@required和@optional,其中在@required下的方法必須實(shí)現(xiàn),@optional中方法是選擇性實(shí)現(xiàn),也可不實(shí)現(xiàn)。
下面以一個(gè)簡(jiǎn)單實(shí)例說明protocol的用法(OS X下)在iOS下同樣使用
一、新建一個(gè)Objective-C class,命名為iOSCoder
①、在iOSCoder@end后面定義一個(gè)protocol,命名為MyprotocolDelegate,并聲明@required和@optional方法
②、在#import后聲明@protocol MyprotocolDelegate
③、在interface中聲明屬性@property(nonatomic,assign) id<MyprotocolDelegate> delegate;
整個(gè).h文件如下
#import <Cocoa/Cocoa.h>
@protocol MyprotocolDelegate;
@interface iOSCoder : NSObject
//聲明delegate屬性
@property(nonatomic,assign) id<MyprotocolDelegate> delegate;
@end
//定義protocol
@protocol MyprotocolDelegate <NSObject>
//必須實(shí)現(xiàn)方法
@required
-(void)StartObjectiveC;
-(void)StartPrograming;
//選擇實(shí)現(xiàn)方法
@optional
-(void)StartJavaScript;
-(void)StartPython;
@end
二、在需要用到iOSCoder類的文件中,聲明并進(jìn)行初始化
如果要用到iOSCoder中的delegate,則必須在.h文件中進(jìn)行聲明,聲明格式
@interface 類名:繼承類<MyprotocolDelegate>
定義iOSCoder對(duì)象
iOSCoder *ios = [[iOSCoder alloc] init];
ios.delegate = self;
if ([ios respondsToSelector:@selector(StartObjectiveC)]) {
[self StartObjectiveC];
}
if ([ios respondsToSelector:@selector(StartPrograming)]) {
[self StartPrograming];
}
實(shí)現(xiàn)required方法
-(void) StartObjectiveC
{
NSLog(@"@required,StartObjectiveC");
}
-(void)StartPrograming
{
NSLog(@"@required,StartPrograming");
}
附:在iOS ViewController中使用時(shí)
假設(shè)A要跳轉(zhuǎn)到B頁(yè)面時(shí)需要在B頁(yè)面中實(shí)現(xiàn)A中的protocol方法
.h文件
#import <UIKit/UIKit.h>
@class AViewController;
@protocol ADelegate <NSObject>
- (void) AMethod
@end
@interface AViewController : UIViewController
{
id<ADelegate> _delegate;
}
@property(nonatomic,assign)id<ADelegate> delegate;
@end
在頁(yè)面跳轉(zhuǎn)之前加上
if (_delegate && [_delegate respondsToSelector:@selector(AMethod)]) {
[_delegate AMethod];
}
在B頁(yè)面中聲明代理<ADelegate>,實(shí)現(xiàn)AMethod方法,實(shí)例化A對(duì)象,并設(shè)置代理
則在B界面會(huì)調(diào)用AMethod方法,即完成了protocol的實(shí)現(xiàn)
相關(guān)文章
iOS緩存文件大小顯示功能和一鍵清理功能的實(shí)現(xiàn)方法
緩存占用了系統(tǒng)的大量空間,如何實(shí)時(shí)動(dòng)態(tài)的顯示緩存的大小,使用戶清晰的了解緩存的積累情況,有效的進(jìn)行一鍵清理呢?下面小編通過本文給大家介紹iOS緩存文件大小顯示功能和一鍵清理功能的實(shí)現(xiàn)方法,一起看看吧2016-10-10iOS UISegmentControl實(shí)現(xiàn)自定義分欄效果
這篇文章主要為大家詳細(xì)介紹了iOS UISegmentControl實(shí)現(xiàn)自定義分欄效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03iOS中的音頻服務(wù)和音頻AVAudioPlayer音頻播放器使用指南
這里我們要介紹的是AVAudio ToolBox框架中的AudioServicesPlaySystemSound函數(shù)創(chuàng)建的服務(wù),特別適合用來制作鈴聲,下面就簡(jiǎn)單整理一下iOS中的音頻服務(wù)和音頻AVAudioPlayer音頻播放器使用指南:2016-06-06iOS中wkwebView內(nèi)存泄漏與循環(huán)引用問題詳解
這篇文章主要給大家介紹了關(guān)于iOS中wkwebView內(nèi)存泄漏與循環(huán)引用問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07