溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Objective-C之成魔之路【7-類、對象和方法】

發(fā)布時間:2020-08-01 19:24:18 來源:網(wǎng)絡(luò) 閱讀:233 作者:danielzzu 欄目:移動開發(fā)

郝萌主傾心貢獻,尊重作者的勞動成果,請勿轉(zhuǎn)載。

如果文章對您有所幫助,歡迎給作者捐贈,支持郝萌主,捐贈數(shù)額隨意,重在心意^_^ 

我要捐贈: 點擊捐贈

Cocos2d-X×××:點我傳送


Objective-C作為一種面向?qū)ο蟮木幊陶Z言, 具有面向?qū)ο?/span>的基本特征, 

即: 封裝、 繼承和多態(tài)。 

主要介紹ObjectiveC中有關(guān)面向?qū)ο蠡靖拍睿?類、 對象、 方法和屬性等。


也就是面向?qū)ο蟪绦蛟O(shè)計的一些關(guān)鍵概念,主要關(guān)注Objective-C定義類相關(guān)的語法。

OC面向?qū)ο蠓矫娴母拍詈推渌Z言差不多。相比其他語言更接近C++。


對象就是一個物件。面向?qū)ο蟮某绦蛟O(shè)計可以看成一個物件和你想對它做的事情。

對象(名詞)----實現(xiàn)(動詞),先定義類(Class),再定義方法(Method)。

C語言是典型的面向過程性語言。

在C語言中,通常是先考慮要實現(xiàn)什么,然后才關(guān)注對象,這幾乎總是與面向?qū)ο蟮乃伎歼^程相反。

實現(xiàn)(動詞)----對象(名詞),先定義函數(shù)(Function),再定義模塊(Module)。


類的獨特存在就是一個實例,對實例執(zhí)行的操作稱為方法。

在某些情況下,方法可以應(yīng)用于類的實例或類本身。

對象使用方法可以影響對象的狀態(tài)。

關(guān)鍵概念:對象是類的獨特表示,每個對象都包含一些通常對該對象來說是私有的信息(數(shù)據(jù))。方法提供訪問和改變這些數(shù)據(jù)的手段。


Objective-C采用特定的語法對類和實例應(yīng)用方法:

[ ClassOrInstance method];


請求一個類或?qū)嵗齺韴?zhí)行某個操作時,就是向它發(fā)送一條消息,消息的接收者稱為Receiver。所以,可以用另外一種方式描述:

[ receiver message];


Objective-C的Method操作執(zhí)行,一種理解是發(fā)送消息,另外一種是方法調(diào)用。

前一種更貼近OC的思想。


Objective-C的類聲明和實現(xiàn)包括兩個部分:接口部分和實現(xiàn)部分。
@interface Song: NSObject {
… …
}
… …
@end
@implementation Song
… …
@end


同樣的,程序在邏輯上就分為下面3個部分:

@interface

@implementation

program


接口部分

@interface部分用于描述類和類的方法;

@implementation部分用于描述數(shù)據(jù)(類對象的實例變量存儲的數(shù)據(jù)),并實現(xiàn)在接口中聲明方法的實際代碼;

主要定義了類名 、 繼承的父類、 實現(xiàn)的協(xié)議、 成員變量和方法等信息。

舉例如下:

一首好聽的音樂,下面的代碼是Song類的接口部分聲明。
@interface Song : NSObject {
NSString *title;
NSString *artist;
long int duration;
}
- (void)start;
- (void)stop;
- (void)seek:(long int)time;
@end

program部分的程序代碼實現(xiàn)了程序的預(yù)期目的。

@interface部分一般格式如下:

@interface NewClassName: ParentClassName

propertyAndMethodDeclarations;

@end


按照約定,類名以大寫字母開頭。

實例變量、對象以及方法的名稱,通常以小寫字母開頭。

確定名稱時,要遵循找到能反映變量或?qū)ο笫褂靡鈭D的名稱。

程序具有更強的自解釋性(Self-explanatory)

制定名稱的規(guī)則相當(dāng)簡單:名稱必須以字母或下劃線(_)開頭,

之后可以使任何大小寫字母、下劃線或者數(shù)字的組合。

另外像$空格等都是非法,記住不能數(shù)字開頭、不能使用保留字。


再次強調(diào),Objective-C是大小寫敏感的。sum、Sum、SUM均表示不同的變量。


實現(xiàn)部分
使用關(guān)鍵字@implementation, 主要實現(xiàn)了在接口部分定義的方法等信息。 

@implementation部分的一般格式如下:

@inplementation NewClassName

{

memberDeclarations;

}

methodDefinitions;

@end

需要注意的是:使用@synthesize指令能讓編譯器自動為你生成一些方法。

舉例如下:

下面的代碼是Song類的實現(xiàn)部分聲明。
@implementation Song
- (void)start {
//
開始播放
}
- (void)stop {
//
停止播放
}
- (void)seek:(long int)time {
//
跳過時間
}
@end

接口和實現(xiàn)的要求:

接口文件包含類的公開信息,即能夠與這個類的使用者共享一些信息。

另一方面,實現(xiàn)部分包含的是私有信息,即實例變量和代碼。


方法和消息

類或?qū)嵗椒ǎ_頭為負號(-)表示實例方法,正號(+)表示類方法

返回類型放在開頭的負號或正號之后的圓括號中。

有參數(shù)時,在方法名后加冒號(:),再加上參數(shù)類型和參數(shù)名。

具體的如下例所示:

-(int) currentAge;

-(void) print;

-(void) setNumber: (int) n;

方法類型 (返回類型) 方法名稱 方法有參數(shù) 參數(shù)類型 參數(shù)名稱


可見,Objective-C中方法定義非常古怪, 它遵循了SmallTalk語法風(fēng)格, 它將一個方法名字分成幾個部分。
Objective-C之成魔之路【7-類、對象和方法】
如圖所示:
Objective-C之成魔之路【7-類、對象和方法】
再次解釋說明:
定義了兩個參數(shù)的方法, 
第一個參數(shù)是anObject, 參數(shù)類型是id類型, 
第二個參數(shù)是index, 參數(shù)類型是NSUInteger,
這叫做多重參數(shù)。 
它的返回類型是void, 
方法簽名是insertObject:atIndex: 。 
方法類型標識符中都“-” 代表方法是實例方法, “+” 代表方法是類方法,
 關(guān)于實例方法和類方法我們將在后面內(nèi)容中討論。 
如果上面的方法變成C或C++形式, 則是下面的樣子的: 
-(void) insertObjectAtIndex(id anObject, NSUInteger index)。

消息發(fā)送
對于方法的調(diào)用通常也不稱之為調(diào)用 , 而是稱為發(fā)出消息,
操作符號不是“. ” 而是“[…] ” , 如下所示: 
[myObject insertObject: ojb1 atIndex:0];
即向myObject對象發(fā)出一個消息insertObject:atIndex: 。
而在實際使用時候這兩種叫法都會用 , 這不是嚴格劃分。

alloc是allocate的縮寫。

如果向某個類發(fā)送alloc消息,便獲得該類的新實例。

這個alloc方法繼承自父類。alloc方法保證對象的所有實例都變成初始狀態(tài)。

當(dāng)然想要適當(dāng)?shù)姆椒〞r,必須重新初始化,調(diào)用init方法。

經(jīng)常地情況是把alloc和init合在一起,或者直接使用new方法。

例如:

Fraction *myFraction; myFraction = [Fraction alloc];//類方法 myFraction = [myFraction init];//實例方法  Fraction *myFraction = [[Fraction alloc] init];//二合一  Fraction *myFraction = [Fraction new];//類方法,new包含alloc和init

記住,方法執(zhí)行的上下文環(huán)境就是接收到消息的對象。

取值方法(get)和賦值方法統(tǒng)(set)稱為訪問方法(accessor)。

這就是數(shù)據(jù)封裝的原則,通過使用方法來訪問對“外界”隱藏的數(shù)據(jù)。


使用一個類的程序結(jié)束本章:

// //  main.m //  3_2_class_object_method // //  Created by haomengzhu on 14-11-01. //  Copyright (c) 2014年 haomengzhu. All rights reserved. //  #import <Foundation/Foundation.h>  //-------- @interface section ---------- @interface Fraction: NSObject -(void) print; -(void) setNumerator: (int) n; -(void) setDenominator: (int) d; @end  //-------- @implementation section ---------- @implementation Fraction {     int numerator;     int denominator; } -(void) print {     NSLog(@"%i/%i", numerator, denominator); } -(void) setNumerator:(int)n {     numerator = n; } -(void) setDenominator:(int)d {     denominator = d; } @end  //-------- program section ----------  int main(int argc, const char * argv[]) {      @autoreleasepool {         Fraction *myFraction;                  // new object         myFraction = [Fraction alloc];         myFraction = [myFraction init];                  // set         [myFraction setNumerator: 1];         [myFraction setDenominator: 3];                  // print all         NSLog(@"Hello, World!");         [myFraction print];     }     return 0; } 


最后再來說說OC中的方法:

關(guān)于方法:

在編寫新方法時,省略參數(shù)名不是一種好的編程風(fēng)格,因為它是程序很難讀懂并且很不直觀,

特別是當(dāng)使用的方法參數(shù)特別重要時,更是如此。

舉例如下:

定義了Fraction類以及新方法:

-(void)setTo:(int)n over:(int)d; 

注意下面的使用方式:

[aFraction set:1 :3]這是不好的

[aFraction set:1 over:3]這是好的


再添加新方法:

- (void)add:(Fraction *) f;

這條語句說明add:方法的參數(shù)是Fraction類對象的一個引用。

星號是必須的,所以聲明(Fraction) f是不正確的。


局部變量:

局部變量是基本的C數(shù)據(jù)類型,并沒有默認的初始值,所以在使用前要先賦值。

局部對象變量默認初始化為nil。

和實例變量不同(它們在多次方法調(diào)用時保持自己的值),這些局部變量沒有記憶力。

也就是說,當(dāng)方法返回時,這些變量的值都消失了。

每次調(diào)用方法時,該方法中的局部變量都使用變量聲明重新初始化一次。


方法的參數(shù):

方法的參數(shù)名也是局部變量。執(zhí)行方法時,通過方法傳遞的任何參數(shù)都被復(fù)制到局部變量中。因為方法使用參數(shù)的副本,所以不能改變通過方法傳遞的原值。這一點很重要。

另外,如果參數(shù)是對象,可以更改其中的實例變量值。當(dāng)你傳遞一個對象作為參數(shù)時,實際上是傳遞了一個數(shù)據(jù)存儲位置的引用。正因為如此,你才能夠修改這些數(shù)據(jù)。


static關(guān)鍵字:

在變量聲明前加上關(guān)鍵字static,可以使局部變量保留多次調(diào)用一個方法所得的值。

和其它基本數(shù)據(jù)類型的局部變量不同。

靜態(tài)變量的初始值為0。

此外,它們只在程序開始執(zhí)行時初始化一次,并且在多次調(diào)用方法時保存這些數(shù)值。

記住:只能在定義靜態(tài)變量和局部變量的方法中訪問這些變量。


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI