方法Method介紹:2-方法的調用

在Objective-C中,調用一個方法相當于傳遞一個消息,這里的消息指的是方法名和參數。所有消息的分派都是動態的,所謂動態指的是所有消息處理直到執行時(runtime)才會動態決定,而不是在編譯時就綁定,這也體現了Objective-C對象的多態行為(多態性是指不同類型的對象響應同一消息的能力)。

1、方法調用的方式

在Objective-C中,調用一個方法相當于傳遞一個消息,消息中包含方法名(也稱為選擇器)和參數。

普通調用:使用方括號[]將消息本身與參數放到括號內,同時將接收消息的對象放在最前面。如下所示:

NSString*str=[NSStringstringWithFormat:@"宏創學院"];//類方法調用

NSString*str2=[NSStringstringWithFormat:@"探索蘋果iOS開發最佳實踐!"];//類方法調用

str=[str stringByAppendingString:str2];//實例方法調用

NSLog(@"%@",str);

嵌套調用:有時為了避免聲明大量的局部變量來存儲臨時結果,Objective-C也支持嵌套消息表達式。上面的案例中,我們可以不聲明str2,可以對代碼做如下改寫:

NSString*str=[NSStringstringWithFormat:@"宏創學院"];//類方法調用

str=[str stringByAppendingString:[NSStringstringWithFormat:@"探索蘋果iOS開發最佳實踐!"]];//方法的嵌套調用

NSLog(@"%@",str);

調用父類的方法:子類可以直接調用父類的方法。如下所示:HCClass繼承自NSObject,因此HCClass的對象myClass可以直接調用NSObject的copy方法。

HCClass*myClass1=[[HCClassalloc]init];

//調用父類的copy方法

HCClass*myClass2=[myClass1 copy];

2、點語法

Objective-C中還提供專門用于調用【存取方法】的點語法。我們可以調用getter/setter方法來獲取/設置實例變量/屬性的值,同樣的,可以使用點語法來更加簡便的獲取/設置對象的值。

下面的示例代碼中,同時使用點語法對myClass對象的className屬性賦值,然后又使用點語法來獲取對應的值。

//實例化對象

HCClass*myClass=[[HCClassalloc]init];

//使用點語法賦值

myClass.className=@"HCClass";

//使用點語法取值

NSLog(@"class name is %@",myClass.className);

3、消息處理機制

為了深入理解消息、方法、接收者這些概念,就必須要了解消息處理的機制。在OC中,消息是直到運行的時候才和方法進行綁定關聯的。

消息機制的關鍵在于編譯器為類和對象生成的結構。其中類的結構中包含兩個基本元素:第一,指向父類的指針;第二,類的方法列表。而對象被創建時,對象的第一個實例變量是一個指向該對象的“類結構”的指針,即isa,通過該指針,就可以訪問到該類及其父類的方法列表。

當向某個對象發送消息時:

首先根據isa指針,找到該對象對應的類結構的方法列表,此時即可找到具體的方法實現;當在本類的方法列表中找不到對應的方法時,會類結構中父類的指針去查找父類的方法列表,直至NSObject根類;

將對象以及參數傳遞給找到的方法實現;

獲取方法的返回值。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容