簡(jiǎn)介
Objective-C 通常寫作 objc 或 OC,是根據(jù) C 語(yǔ)言所衍生出來(lái)的語(yǔ)言,繼承了 C 語(yǔ)言的特性,是擴(kuò)充 C 語(yǔ)言的面向?qū)ο缶幊陶Z(yǔ)言。
Objective-C 是面向?qū)ο?/strong>語(yǔ)言。而 C 語(yǔ)言是面向過(guò)程語(yǔ)言。
Objective-C 是 MAC OSX 和 iOS 開(kāi)發(fā)的基礎(chǔ)語(yǔ)言。
優(yōu)點(diǎn)及缺點(diǎn)
- Objective-C 是非常“實(shí)際”的語(yǔ)言。它使用一個(gè)用 C 寫成的,很小的運(yùn)行庫(kù),OC 寫成的程序通常不會(huì)比其原始碼大很多。
- Objective-C 的最初版本并不支持垃圾回收。
- Objective-C 不包括命名空間機(jī)制(namespace mechanism)。
- 雖然 Objective-C 是 C 的母集,但它也不視 C 的基本型別為第一級(jí)的對(duì)象。
- 和 C++ 不同,Objective-C 不支持運(yùn)算子重載(它不支持 ad-hoc 多型)。
- Object-C 僅支持單一父類繼承,不支持多重繼承。
和 C++ 的比較
目前只有 Apple 使用 Objective-C 作為其支持的語(yǔ)言。
-
與 C++ 的不同之處有:
- O-C 中所有的類都必須直接或間接繼承自 NSObject;
- O-C 中所有對(duì)象都是指針的形式;
- O-C 用
self
代替this
; - O-C 使用
id
代替void
; - O-C 使用
nil
表示NULL
; - O-C 只支持單繼承;
- O-C 使用
YES
/NO
表示TRUE
/FALSE
; - O-C 使用
#import
代替#include
; - O-C 中用消息表示類的方法,并采用
[aInstance method:argv]
調(diào)用形式; - O-C 支持反射機(jī)制;
- O-C 支持Dynamic Typing, Dynamic Binding和Dynamic Loading。
-
與C++的相同之處有:
- 與C共享的部分一致;
- 可以使用
assert(BOOL)
, 一般用NSCParameterAssert(BOOL)
代替。
-
O-C中的命名前綴說(shuō)明:
- NS-:NextStep;
- CF-:Core Foundation;
- CA-:Core Animation;
- CG-:Core Graphics;
- UI-:User Interface;
-
O-C中的消息特殊性:
- 調(diào)用消息的類可以不知道如何響應(yīng)這個(gè)消息。如果它不知道如何處理這個(gè)消息,它會(huì)自動(dòng)將這個(gè)消息傳遞給其他的類,比如它的父類。
- 調(diào)用消息的類可以是
nil
。在 C++ 中,在使用類方法之前,我們都需要檢查對(duì)象是否為空,所以在實(shí)現(xiàn)析構(gòu)函數(shù)的時(shí)候,常會(huì)有如下的代碼,如if (var) { delete var; }
但是在 Objective-C 中,我們就可以直接寫[var release];
即使var = nil
也不會(huì)有問(wèn)題。
O-C中的函數(shù)聲明格式有:
-/+ (return type)function_name;
-/+ (return type)function_name:(parameter type)parameter;
-/+ (return type)function_name:(parameter type)parameter1 otherParameter:(parameter_type)parameter2;
以上參數(shù)說(shuō)明:-表示一般函數(shù),+表示靜態(tài)函數(shù)。otherParameter是參數(shù)的別名(第一個(gè)參數(shù)的別名省略),在函數(shù)調(diào)用時(shí)方便指定。
-
O-C中的構(gòu)造/析構(gòu)函數(shù):
- O-C中的
init()/release()
對(duì)應(yīng)于C++的構(gòu)造/析構(gòu)函數(shù)。alloc()/dealloc()
也就對(duì)應(yīng)于C++的new
和delete
,其中的dealloc()
由于引用計(jì)數(shù)的自動(dòng)調(diào)用而不用手動(dòng)調(diào)用。 - O-C中父類的
init()/release()
函數(shù)需要子類的手動(dòng)調(diào)用。而且每次都必須調(diào)用。不同于C++的自動(dòng)調(diào)用。 - 構(gòu)造函數(shù)
(- (id) init)
調(diào)用形如:CSample* pSample=[[CSample alloc] init]
; 其中 alloc 是繼承來(lái)的 static 函數(shù),init 是繼承來(lái)的一般函數(shù),如重寫一般函數(shù)時(shí),則相當(dāng)于 C++ 的覆蓋(不帶參數(shù))或重載(帶參數(shù))。 - 析構(gòu)函數(shù)(
- (void)release
)將引用計(jì)數(shù)減1,當(dāng)=0時(shí)父類的 release() 會(huì)自動(dòng)調(diào)用 dealloc;
- O-C中的
當(dāng)O-C沒(méi)有數(shù)據(jù)成員時(shí),可省略{},建議保留。
繼承下來(lái)的方法,如:
-(id)init
可以頭文件中省略,建議保留。-
0-C中只有數(shù)據(jù)成員的訪問(wèn)限制,沒(méi)有方法的訪問(wèn)限制。
- 同 C++ 一樣,數(shù)據(jù)成員有三種訪問(wèn)限制 public, protected, private,默認(rèn)是 protected。
示例:
- 同 C++ 一樣,數(shù)據(jù)成員有三種訪問(wèn)限制 public, protected, private,默認(rèn)是 protected。
@interface AccessExample: NSObject {
@public
int publicVar;
@protected
int protectedVar;
@private
int privateVar;
}
@end
方法的訪問(wèn)限制可通過(guò)Category(類別)實(shí)現(xiàn),示例代碼:
// MyClass 類
@interface MyClass
-(void) sayHello
{
NSLog(@"Hello");
}
@end
// MyClass 的擴(kuò)展類
@interface MyClass(Private)
-(void) kissGoodbye;
@end
O-C中沒(méi)有類的靜態(tài)變量,只有全局變量。
O-C中的數(shù)組 NSArray 可以保存不同類型的數(shù)據(jù)。
O-C也支持 run-time 時(shí)的類型檢查:
- (BOOL) isKindOfClass: classObj
用于判斷該對(duì)象是否屬于某個(gè)類或者它的子類。
- (BOOL) isMemberOfClass: classObj
用于判斷該對(duì)象是否屬于某個(gè)類(這里不包括子類) 。
- (BOOL) respondsToSelector: selector
用于判斷該對(duì)象是否能響應(yīng)某個(gè)消息。這里,我們可以將@selector后面帶的參數(shù)理解為C++中的函數(shù)指針。
注意:1)不要忘了@
2)@selector后面用的是(),而不是[]。
3)要在消息名稱后面跟:,無(wú)論這個(gè)消息是否帶參數(shù)。
如:[pSquare respondsToSelector:@selector(Set: andHeight:)]。
+ (BOOL) instancesRespondToSelector: selector
用于判斷該類是否能響應(yīng)某個(gè)消息。這是一個(gè)靜態(tài)函數(shù)。
-(id) performSelector: selector :
調(diào)用對(duì)象的selector方法。
conformsToProtocol
類似于respondsToSelector
,用于動(dòng)態(tài)檢查某個(gè)對(duì)象是否遵守某個(gè)協(xié)議。-
Category:范疇/擴(kuò)展類:在沒(méi)有源代碼的情況下,為一個(gè)已經(jīng)存在的類添加一些新的功能。
- 只能添加新的方法,不能添加新的數(shù)據(jù)成員;
- Category的名字必須是唯一的。
Protocol:協(xié)議類:相當(dāng)于C++中的純虛類
//創(chuàng)建協(xié)議
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
//規(guī)則1
//規(guī)則2
@required //表示修飾的協(xié)議方法必須實(shí)現(xiàn)
//完成作業(yè)的協(xié)議方法
- (void)finishTask;
//不能遲到的協(xié)議方法
-(void)dontLate;
@optional //表示修飾的協(xié)議可選,可實(shí)現(xiàn)/可不實(shí)現(xiàn)
//穿戴整潔
- (void)wearNeat;
@end
// 類簽訂協(xié)議:<協(xié)議名>
@interface Student: NSObject < MyProtocol > {
//實(shí)現(xiàn)協(xié)議方法
- (void)finishTask{...}
-(void)dontLate{...}
} @end
// 使用:
Student * student1 = [[Student alloc] init];
id< MyProtocol > student1 = dat;
- 說(shuō)明:我們首先聲明了MyProtocol協(xié)議,任何遵守這個(gè)協(xié)議的類,都必須實(shí)現(xiàn)@required中的方法。在Objective-C 中,我們通過(guò)<>來(lái)表示遵守某個(gè)協(xié)議。當(dāng)某個(gè)類聲明要遵守某個(gè)協(xié)議之后,它就必須在.m文件中實(shí)現(xiàn)這個(gè)協(xié)議中的所有方法。使用id< MyProtocol > 作為類型,而不是像C++中的MyProtocol* var。
- IBOutlet, IBAction: 告訴Xcode之后會(huì)使用Interface Builder關(guān)聯(lián)該插座變量、動(dòng)作。如果你希望在Interface Builder中能看到這個(gè)控件對(duì)象,那么在定義的時(shí)候前面加上IBOutlet,在IB里就能看到這個(gè)對(duì)象的outlet,如果你希望在Interface Builder里控制某個(gè)對(duì)象執(zhí)行某些動(dòng)作,就在方法前面加上IBAction。
形如:
// 聲明一個(gè)屬性 questionLabel,可以指向 UILabel 對(duì)象
@property(nonatomic, weak) IBOutlet UILabel *questionLabel;
//方法:實(shí)現(xiàn) Botton 動(dòng)作
- (IBAction)showQuestion:(id)sender{
//...
}
盡量避免在一行語(yǔ)句中進(jìn)行兩層以上的嵌套。
消息轉(zhuǎn)發(fā):
- (void) forwardInvocation: (NSInvocation *)anInvocation;
擴(kuò)展的關(guān)鍵字
@interface
類型聲明,類似于 c++ 中的 class,區(qū)別在于OC中的聲明與實(shí)現(xiàn)是強(qiáng)制分開(kāi)的,@interface存放于.h文件中,而@implementation存放于.m文件中。@interface關(guān)鍵字用于類型的聲明,包括數(shù)據(jù)成員、方法聲明、屬性等。方法的參數(shù)傳遞采用中綴符的形式,利用“:
”分割參數(shù)名和被傳遞參數(shù),類型的聲明以 @interface
開(kāi)頭,以 @end
結(jié)束,通常一個(gè)類型的聲明采用下面的結(jié)構(gòu):
@class someOtherObject //外部類型聲明
@interface NewClassName : ParentClassName //類型聲明 子類:父類
{
// 定義屬性
// 全局變量,成員變量,實(shí)例變量
NSInteger _age; //年齡
NSString *_name; //姓名
float _weight; //體重
}
//方法定義
-(void)shopping;//不帶參數(shù)的方法
-(void)goshopping:(float)price; //帶參數(shù)的方法
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg;
//類方法,使用類名調(diào)用的方法 [類名 方法]
//以'+'開(kāi)頭
+(id)someMethod:(int)someArg;
-(id)init; //初始化方法
@property int num; //屬性,為屬性自動(dòng)生成set和get方法
@end
@implementation
對(duì)應(yīng)于@interface的類型聲明,@implementation表示一個(gè)類型的實(shí)現(xiàn)過(guò)程,存放于‘.m’文件中,同樣以@end結(jié)束,實(shí)現(xiàn)的格式通常如下:
//預(yù)編譯指令,只編譯 .m 文件,而 .h 文件導(dǎo)入到此處處理。
#import "Person.h"
@implementation NewClassName
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg
{
//實(shí)現(xiàn)代碼
}
+(id)someMethod:(int)someArg
{
//類方法實(shí)現(xiàn)代碼
//與實(shí)例方法的區(qū)別:類方法中不能使用屬性
}
@synthesize num=i; //將屬性與變量進(jìn)行對(duì)應(yīng)
@end
new、alloc
Object-C中的方法調(diào)用形式采用消息發(fā)送的方式,通常調(diào)用的形式如:
[someObject someMethod:firstArg someOtherArgName:otherArg];
實(shí)例的初始化也采用消息發(fā)送的形式,可以簡(jiǎn)單的調(diào)用類型的new方法來(lái)獲取一個(gè)實(shí)例對(duì)象,簡(jiǎn)單實(shí)例化的方法通常是:
someObject *obj = [someObject new]; //類的實(shí)例化
new 方法的實(shí)際過(guò)程是調(diào)用 alloc 和 init 方法,因此如果需要采用自定義的方法來(lái)初始化實(shí)例,則需要自己重寫 init
方法,通常的初始化方式為:
someObject *obj = [[someObject alloc] init]; //采用無(wú)參數(shù)的init實(shí)例化
someObject *obj = [[someObject alloc] initWithArg:Arg]; //采用參數(shù)的實(shí)例化
@class
@class是一個(gè)前向引用聲明,類似于C++中的friend友元聲明,其作用是告訴編譯器其后面的字段代表一個(gè)類型名稱,盡管不知道類型的具體實(shí)現(xiàn),但是只需要將其作為一個(gè)類型名稱處理即可。通常在使用復(fù)合的結(jié)構(gòu)時(shí)可以采用@class來(lái)減少頭文件的相互引用,如果出現(xiàn)循環(huán)依賴,則需要依靠@class來(lái)避免引用的死循環(huán)。
- @class 可以解決 #import 引起的相互導(dǎo)入而導(dǎo)致的循環(huán)引用問(wèn)題。
- 在頭文件里要使用其他類,一般用@class, 在實(shí)現(xiàn)文件用#import導(dǎo)入類文件。
通常使用形式為:
@class someOtherObject;
@interface someObject:NSObject
{
someOtherObject *obj;
}
@end
#import
類似于C語(yǔ)言中的 #include,導(dǎo)入一個(gè)頭文件,獲取該頭文件中類的定義—方法和屬性。
@property
- 盡管可以使用 obj->arr 的形式去強(qiáng)制讀取對(duì)象的成員變量,但是良好的編程形式是對(duì)外界提供成員變量的讀寫接口。@property關(guān)鍵字提供了外界對(duì)成員變量的訪問(wèn)接口,其本質(zhì)是自動(dòng)為某一個(gè)屬性生成set和get方法。
- 根據(jù)不同的需要,可以添加 readonly(只讀,相當(dāng)于只添加get不添加set方法)或者 readwrite(讀寫,如果不添加則為默認(rèn));
- 還有三種賦值方式可選 :assign(直接賦值,通常用于基本類型),retain(釋放舊值,增加新的retaincount),copy(常用于字符串,生成一個(gè)新的拷貝).
格式:
@property(原子性?,賦值?,讀寫性?)NSString *XXX;
1.原子性
* atomic:多線程環(huán)境下,存在線程保護(hù);
* nonatomic:多線程環(huán)境下,不存在線程保護(hù);
2.賦值
* assign:直接賦值,默認(rèn);(對(duì)象之外的類型使用)
* retain:保留對(duì)象;(所有的對(duì)象,都使用 retain)
* copy:拷貝對(duì)象;NSString 的對(duì)象都使用 copy
3.讀寫性
* readwrite:生成getter、setter方法,默認(rèn);
* readonly:只生成getter方法
作用:
1.生成一個(gè) _XXX 屬性,此屬性是 private ,不能被繼承;
2.自動(dòng)為該屬性生成 set 和 get 方法。
通常使用的方式如下:
@interface someObject:NSObject
{
int i; //成員變量
}
@property (assign,readonly) int num; //屬性(注意無(wú)需下劃線)
@end
@synthesize
與 @property 對(duì)應(yīng),將一個(gè)外在屬性與成員變量相關(guān)聯(lián),定義在 @implementation 中,如果屬性名與變量名一致則可以省略變量名。常用方法:
@implementation someObject
@synthesize num=i;//如果屬性名也為i,則可以直接寫為 @synthesize i
//更改屬性名,將默認(rèn)的 _username 改為 _name
@synthesize username = _name;
@end
內(nèi)存管理
- 內(nèi)存管理是關(guān)于如何管理 對(duì)象 生命周期的編程原則。
- Object-C采用引用計(jì)數(shù)的方式進(jìn)行內(nèi)存管理,由于所有的對(duì)象都繼承于 NSObject,因此所有的對(duì)象都可以接受 NSObject 的三個(gè)方法:
-(id)retain; //retain方法將對(duì)象的引用計(jì)數(shù)加1并返回該對(duì)象
-(void)release; //release將引用計(jì)數(shù)減1
-(unsigned)retainCount; //retainCount方法返回對(duì)象當(dāng)前的引用計(jì)數(shù)
- 當(dāng)采用
new
、alloc
、copy
方法創(chuàng)建一個(gè)對(duì)象時(shí),它的引用計(jì)數(shù)被置為1,如果程序中對(duì)該對(duì)象進(jìn)行操作,則應(yīng)根據(jù)需要,通過(guò)調(diào)用retain
和release
方法來(lái)保證該對(duì)象在不需要的時(shí)候被清除。當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)被置為0后,系統(tǒng)會(huì)自動(dòng)向?qū)ο蟀l(fā)送一個(gè)dealloc
消息,將其占有的資源釋放。通常情況下,如果一個(gè)對(duì)象的初始化過(guò)程調(diào)用了其他資源,則應(yīng)該重寫該對(duì)象的dealloc
過(guò)程,保證在對(duì)象的銷毀期正確釋放這些資源。 - Object-C進(jìn)行內(nèi)存管理的3條規(guī)則是:
- 如果使用
new
、alloc
、copy
操作獲得一個(gè)對(duì)象,則該對(duì)象的保留計(jì)數(shù)器值為1. - 如果通過(guò)任何其他方法獲得一個(gè)對(duì)象,則假設(shè)該對(duì)象的保留計(jì)數(shù)器值為1,而且已經(jīng)被設(shè)置為自動(dòng)釋放。
如果保留了某個(gè)對(duì)象,則必須保持
retain
方法和release
方法的使用次數(shù)相等。retainCount:內(nèi)存管理默認(rèn)為系統(tǒng)自動(dòng).
內(nèi)存管理改為手動(dòng)方法:選中Project -> Build settings -> 搜索框搜索“arc”,將 Object-C Automatic Reference Counting值設(shè)置為No;
手動(dòng)內(nèi)存管理(MRC)黃金法則:如果對(duì)一個(gè)對(duì)象使用了 alloc,[mutable]copy,retain, 那么你必須使用相應(yīng)的 release 或者 autorelease 釋放.為了更加方便的進(jìn)行能存管理,cocoa中提供了一個(gè)自動(dòng)釋放池(autorelease pool)的概念,每一個(gè)類都繼承了一個(gè)autorelease方法,當(dāng)調(diào)用對(duì)象的autorelease方法時(shí),該對(duì)象會(huì)被加入到開(kāi)始創(chuàng)建的自動(dòng)釋放池中。當(dāng)程序進(jìn)行到不再需要自動(dòng)釋放池中的對(duì)象時(shí),將自動(dòng)釋放池釋放的時(shí)候會(huì)向池中的所有對(duì)象發(fā)送一個(gè)
release
消息,從而保證不再需要的對(duì)象被正確的釋放。通常的用法如下:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
someObject * obj = [[someObject alloc] init];
[obj autorelease]; //將 obj 對(duì)象加入自動(dòng)釋放池中,引用計(jì)數(shù)不會(huì)-1.
//其他代碼
[pool release]; //執(zhí)行該語(yǔ)句時(shí),系統(tǒng)會(huì)向池內(nèi)所有的對(duì)象發(fā)送 release 消息;
在這個(gè)例子中,如果對(duì)obj進(jìn)行的其他 retain
操作和 release
操作保持一致的話,則會(huì)將obj的引用計(jì)數(shù)變?yōu)?,從而調(diào)用它的 dealloc
方法進(jìn)行資源釋放.
ARC
- ARC自動(dòng)引用計(jì)數(shù)(automatic reference counting),提供自動(dòng)管理內(nèi)存的功能。
- 不需要手動(dòng)管理引用計(jì)數(shù),不需要也不允許
retain
、release
、autorelease
。 - 注意版本的支持是在iOS4(不支持弱引用)、iOS5上。
內(nèi)存中的區(qū)域劃分
- 棧:棧區(qū)(stack)由系統(tǒng)自動(dòng)分配和釋放 ,存放局部變量的值等。
- 堆:一般由程序員分配和釋放,如果不釋放,則出現(xiàn)內(nèi)存泄露。程序退出時(shí), 系統(tǒng)會(huì)回收你的內(nèi)存。特點(diǎn):無(wú)序、速度慢、容量大。
- 靜態(tài)存儲(chǔ)區(qū):全局變量(外部變量)和靜態(tài)變量都存放在靜態(tài)區(qū)域。當(dāng)程序結(jié)束時(shí),系統(tǒng)回收。
- 常量區(qū):存放常量的內(nèi)存區(qū)域,程序結(jié)束時(shí),系統(tǒng)回收。
- 代碼區(qū):存放二進(jìn)制代碼的區(qū)域。
數(shù)組內(nèi)存管理
- 如果一個(gè)對(duì)象被添加到數(shù)組,那么這個(gè)對(duì)象的引用計(jì)數(shù)會(huì)被 retain 而 +1.
- 數(shù)組銷毀或者 removeAllObjects,會(huì)給每一個(gè)元素發(fā)送 release 消息。
//對(duì)數(shù)組中的每一個(gè)元素發(fā)送release消息
[array removeAllObjects];
//移除下標(biāo)為1的元素,同時(shí)向它發(fā)送release消息
[array removeObjectAtIndex:1];
類方法創(chuàng)建的內(nèi)存管理
- Foundation 中的類可以通過(guò) alloc 創(chuàng)建和 類方法 創(chuàng)建,區(qū)別在于內(nèi)存管理不一樣。
- 類方法 創(chuàng)建的對(duì)象是加入了自動(dòng)釋放池。
- 新語(yǔ)法(簡(jiǎn)便寫法)創(chuàng)建的對(duì)象和類方法創(chuàng)建的對(duì)象相同,由自動(dòng)釋放池管理。
Category (類別、類目)
- 類目是為現(xiàn)有的類提供一個(gè)新的方法的方法,即使沒(méi)有一個(gè)類的源代碼,仍然可以向類中添加一個(gè)方法以方便使用。
- 通過(guò)類目擴(kuò)展的方法,子類也能繼承下來(lái)。
- 類目不能為原始類增加屬性。
- 無(wú)法調(diào)用原始類的方法。
- 類目的主要目的有3個(gè):將類的實(shí)現(xiàn)分散到多個(gè)不同的文件或框架中,創(chuàng)建對(duì)私有方法的前向引用,向?qū)ο筇砑臃钦絽f(xié)議。
- 類目的定義和類的定義相似。在.h文件里聲明,.m文件里實(shí)現(xiàn)方法。
- 定義類目的文件命名規(guī)則: 類名+類目名稱,如“NSString+Revert”。
類目的創(chuàng)建: 菜單選File -> New -> File -> Object-C File ->選擇File Type為 Category
類別的聲明方法:
@interface NSString (Extension)
{
// NSString *s = @"hello"; 錯(cuò)誤!類目不能創(chuàng)建屬性!!!
}
// 要擴(kuò)展的方法
-(id)someMethod:(int)someArg;
//覆寫父類方法
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
@end
類別的實(shí)現(xiàn)方法:
@implementation NSString (Extension)
-(id)someMethod:(int)someArg; {
//實(shí)現(xiàn)代碼
}
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator{
//無(wú)法調(diào)用原始類的方法
//實(shí)現(xiàn)代碼
return expression;
}
@end
延展
在類的實(shí)現(xiàn)文件.m中定義類目,叫延展。
//延展:使用類目聲明方法,在實(shí)現(xiàn)類中實(shí)現(xiàn)此方法
//延展可以在.h中聲明,也可以在.m中聲明
@interface Persion (p2)
-(id)someMethod:(int)someArg;
@end
@protocol (協(xié)議)
- Object-C中的協(xié)議類似于java中的接口,通過(guò)@protocol關(guān)鍵字定義一個(gè)或多個(gè)需要遵從協(xié)議的對(duì)象實(shí)現(xiàn)的方法。
- 協(xié)議本身不是類,它定義了一組方法,讓其他類來(lái)實(shí)現(xiàn)。
- 在類實(shí)現(xiàn)時(shí)需要將協(xié)議中規(guī)定的方法都予以實(shí)現(xiàn)。Object C 2.0增加了2個(gè)新的協(xié)議修飾符@optional和@required,可以規(guī)定協(xié)議中的方法是否為必須實(shí)現(xiàn)的方法。
-
創(chuàng)建方式:菜單選File -> New -> File -> Object-C File ->自定義協(xié)議名,選擇File Type為 Protocl。
協(xié)議定義的方法:
@protocol MyProtocol < NSObject >
@required //表示修飾的協(xié)議方法必須實(shí)現(xiàn)
-(void)someMethod1; //協(xié)議方法
@optional //表示修飾的協(xié)議可選,可實(shí)現(xiàn)/可不實(shí)現(xiàn)
-(void)someMethod2;
@end
采用協(xié)議的方法需在類聲明時(shí)使用尖括號(hào)注明其需要使用的協(xié)議:
@interface someObject:NSObject <MyProtocol>
然后在 .m 文件中添加協(xié)議中需要實(shí)現(xiàn)的方法。
self 和 super
- self指的是類對(duì)象本身;
- super是父類對(duì)象本身;
- self用來(lái)調(diào)用本類對(duì)象的方法;
- self關(guān)鍵字先從本類中查找是否有此方法,如果沒(méi)有,再?gòu)母割愔姓{(diào)用此方法;
- super調(diào)用從父類繼承下來(lái)的方法;
- super關(guān)鍵字直接調(diào)用父類中定義的方法.