類和方法的定義
一般類都是繼承nsobject,新建一個類時父類選擇nsobject即可,oc只有單繼承,沒有多繼承。
下面以一個簡單的oc工程來講解(需配置好xcode工具以相應的sdk),會建工程的請直接跳到‘六'步驟。
一、新建一個oc編譯環境,打開xcode->file->new->project(快捷鍵 command+shift+n)。
二、選擇os x--application--command line tool,選擇next
三、填寫項目名稱(最好英文),你自己的名字,和公司的標志。type選擇foundation,下面的勾表示是否選擇arc,建議初學者勾上。點擊next
四、此時工程建好了,會看到一個main.m文件,所有的調用都在main.m中完成。
新建一個類,command+n,選擇父類nsobject,取名people
五、點擊next之后,出現以下界面,切記下面的√要打上。否則在編譯時工程搜索不到此文件,會出現編譯錯誤。
六、在people.h文件interface中添加變量,nsstring為oc的字符串變量。
@interface person : nsobject {
nsstring * _name;
int _age;
}
然后在{}外面定義變量的初始化方法和set方法,格式:-(類型)方法名:(參數類型)參數1 參數名:(參數類型)參數2……,set方法名一般為set變量名,變量名首字母大寫,此未蘋果官方文檔上的說明
-(void)setage:(int)age;
-(void)setname:(nsstring *)name;
定義變量的get方法,get方法名同樣為get變量名
-(int)age;
-(nsstring *)name;
七、在people.m文件中實現people.h文件中聲明的方法。
-(void)setage:(int)age {
_age = age;
}
-(void)setname:(nsstring *)name {
_name = [name copy];//copy方法涉及到oc的內存管理機制。使用copy可防止內存泄露
}
-(int)age {
return _age;
}
-(nsstring *)name {
return _name;
}
七、在main.m中定義一個people類,并對其屬性變量進行初始化。
定義一個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語言打印的關鍵字打印,nsinteger,nsnumber打印時用%d。
打印結果:
protocol協議,設置代理
協議(protocol)是objc中很重要的一部分,它用來定義可由任何其他類完成的方法,當本類中需要完成某些功能時,可由protocol來實現
protocol在三種情況中需要用到:
需要聲明別的類期望完成的方法時
在隱藏自身類的情況下聲明該類對象的接口時
在某些沒有繼承關系的類之間獲取其之間的相似性,即兩個類之間沒有繼承關系,但是都需要實現同樣的方法時,就可通過代理來實現。
protocol文件中只是定義一些方法,當你在類中實現了這個protocol時,你就需要補充這些方法,系統會自動調用這些方法
protocol中方法分為@required和@optional,其中在@required下的方法必須實現,@optional中方法是選擇性實現,也可不實現。
下面以一個簡單實例說明protocol的用法(os x下)在ios下同樣使用
一、新建一個objective-c class,命名為ioscoder
①、在ioscoder@end后面定義一個protocol,命名為myprotocoldelegate,并聲明@required和@optional方法
②、在#import后聲明@protocol myprotocoldelegate
③、在interface中聲明屬性@property(nonatomic,assign) id<myprotocoldelegate> delegate;
整個.h文件如下
#import <cocoa/cocoa.h>
@protocol myprotocoldelegate;
@interface ioscoder : nsobject
//聲明delegate屬性
@property(nonatomic,assign) id<myprotocoldelegate> delegate;
@end
//定義protocol
@protocol myprotocoldelegate <nsobject>
//必須實現方法
@required
-(void)startobjectivec;
-(void)startprograming;
//選擇實現方法
@optional
-(void)startjavascript;
-(void)startpython;
@end
二、在需要用到ioscoder類的文件中,聲明并進行初始化
如果要用到ioscoder中的delegate,則必須在.h文件中進行聲明,聲明格式
@interface 類名:繼承類<myprotocoldelegate>
定義ioscoder對象
ioscoder *ios = [[ioscoder alloc] init];
ios.delegate = self;
if ([ios respondstoselector:@selector(startobjectivec)]) {
[self startobjectivec];
}
if ([ios respondstoselector:@selector(startprograming)]) {
[self startprograming];
}
實現required方法
-(void) startobjectivec
{
nslog(@"@required,startobjectivec");
}
-(void)startprograming
{
nslog(@"@required,startprograming");
}
附:在ios viewcontroller中使用時
假設a要跳轉到b頁面時需要在b頁面中實現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
在頁面跳轉之前加上
if (_delegate && [_delegate respondstoselector:@selector(amethod)]) {
[_delegate amethod];
}
在b頁面中聲明代理<adelegate>,實現amethod方法,實例化a對象,并設置代理
則在b界面會調用amethod方法,即完成了protocol的實現