Objective-C 簡(jiǎn)介

簡(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++ 的比較

  1. 目前只有 Apple 使用 Objective-C 作為其支持的語(yǔ)言。

  2. 與 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。
  3. 與C++的相同之處有:

    • 與C共享的部分一致;
    • 可以使用assert(BOOL), 一般用NSCParameterAssert(BOOL)代替。
  4. O-C中的命名前綴說(shuō)明:

    • NS-:NextStep;
    • CF-:Core Foundation;
    • CA-:Core Animation;
    • CG-:Core Graphics;
    • UI-:User Interface;
  5. 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)題。
  6. 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í)方便指定。

  1. 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++的 newdelete,其中的 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;
  2. 當(dāng)O-C沒(méi)有數(shù)據(jù)成員時(shí),可省略{},建議保留。

  3. 繼承下來(lái)的方法,如:-(id)init 可以頭文件中省略,建議保留。

  4. 0-C中只有數(shù)據(jù)成員的訪問(wèn)限制,沒(méi)有方法的訪問(wèn)限制。

    • 同 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   
  1. O-C中沒(méi)有類的靜態(tài)變量,只有全局變量。

  2. O-C中的數(shù)組 NSArray 可以保存不同類型的數(shù)據(jù)。

  3. 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é)議。

  4. Category:范疇/擴(kuò)展類:在沒(méi)有源代碼的情況下,為一個(gè)已經(jīng)存在的類添加一些新的功能。

    • 只能添加新的方法,不能添加新的數(shù)據(jù)成員;
    • Category的名字必須是唯一的。
  5. 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。
  1. 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{
  //...
}
  1. 盡量避免在一行語(yǔ)句中進(jìn)行兩層以上的嵌套。

  2. 消息轉(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)用 allocinit 方法,因此如果需要采用自定義的方法來(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)采用 newalloccopy 方法創(chuàng)建一個(gè)對(duì)象時(shí),它的引用計(jì)數(shù)被置為1,如果程序中對(duì)該對(duì)象進(jìn)行操作,則應(yīng)根據(jù)需要,通過(guò)調(diào)用 retainrelease 方法來(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ī)則是:
  1. 如果使用 newalloccopy 操作獲得一個(gè)對(duì)象,則該對(duì)象的保留計(jì)數(shù)器值為1.
  2. 如果通過(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ù),不需要也不允許 retainreleaseautorelease
  • 注意版本的支持是在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)用父類中定義的方法.

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容