溫馨提示×

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

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

Objective-C(2)離不開(kāi)的---類(lèi)與對(duì)象

發(fā)布時(shí)間:2020-07-11 11:17:58 來(lái)源:網(wǎng)絡(luò) 閱讀:343 作者:ymanmeng123 欄目:移動(dòng)開(kāi)發(fā)
  • 接口與實(shí)現(xiàn)的分離

Objective-C定義一個(gè)類(lèi),分成兩部分:接口、實(shí)現(xiàn)

     接口(公開(kāi)):聲明類(lèi)中的成員變量、屬性、方法。

     實(shí)現(xiàn)(隱藏):實(shí)現(xiàn)類(lèi)中的方法。

接口與實(shí)現(xiàn)分離的好處:

          想要使用這個(gè)類(lèi)時(shí)只需知道接口部分即可。

          同時(shí)將實(shí)現(xiàn)部分隱藏起來(lái),有利于代碼的封裝

     例如:實(shí)現(xiàn)一個(gè)汽車(chē)類(lèi),只需要知道如何開(kāi)車(chē),而不需要汽車(chē)如何工作的


  • 定義類(lèi)的接口部分

關(guān)鍵字:@interface  @end

     @interface className : parentClassName

     {

          //成員變量

     }

          //方法的聲明以及屬性的聲明

     @end

成員變量的訪問(wèn)權(quán)限:

     @public          作用域不受限制                              //如

     @protected    作用域被限定在類(lèi)和子類(lèi)中

     @private         作用域被限定在類(lèi)中

     @package      作用域被限定在整個(gè)框架中

     默認(rèn)是@protected

方法的聲明方式:

     - (type) methodName;

示例代碼:

//接口部分:屬性、方法的聲明
@interface AMStudent : NSObject
{//編程規(guī)范:屬性名以_開(kāi)頭,多個(gè)單詞,除第一個(gè)單詞意外的單詞首字母大寫(xiě)
    NSInteger _id;
    NSString *_name;//OC對(duì)象必須用指針存儲(chǔ)地址
    NSInteger _age;
    NSInteger _score;
}
/**
 顯示學(xué)生信息
 */
- (void) showInfo;

@end

    /** */ 是Xcode特有的注釋方式

    在Xcode環(huán)境中,調(diào)用該方法的自動(dòng)補(bǔ)齊提示處,提示注釋內(nèi)容

    小伙伴們可以試一試


  • 定義類(lèi)的實(shí)現(xiàn)部分

關(guān)鍵字:@implementation  @end

     @implementation class_name

     {

          //私有成員變量

     }

     //方法的實(shí)現(xiàn)

     @end

     可以在實(shí)現(xiàn)部分定義成員變量,但不鼓勵(lì)這么去做

          權(quán)限一定是private;不能和接口部分的成員變量重復(fù) 

    方法的實(shí)現(xiàn)和實(shí)現(xiàn)函數(shù)類(lèi)似


示例代碼:

//實(shí)現(xiàn)部分:方法的定義
@implementation AMStudent

- (void)showInfo
{
    NSLog(@"[id:%ld][name:%@][age:%ld][score:%ld]", self->_id, self->_name, self->_age, self->_score);
}


@end

其他注意:

     @interface...@end以及@implementation...@end不能嵌套

     接口部分聲明的方法,在實(shí)現(xiàn)部分必須要給出實(shí)現(xiàn)

     實(shí)現(xiàn)部分的方法如果在接口部分沒(méi)有聲明接口,則成為一個(gè)內(nèi)部方法不對(duì)外公開(kāi)



  • 實(shí)例化對(duì)象

實(shí)例化一個(gè)對(duì)象,是按照定義的類(lèi)創(chuàng)造出一個(gè)實(shí)體對(duì)象,如根據(jù)汽車(chē)的圖紙(類(lèi))造出汽車(chē)(對(duì)象)。

最簡(jiǎn)單的方法是:

     className * objName = [className new];

     Objective-C的對(duì)象,必須使用指針存儲(chǔ)地址,不能創(chuàng)建局部對(duì)象和全局對(duì)象

     []運(yùn)算符的含義是: 向?qū)ο蟀l(fā)送一個(gè)消息,對(duì)象收到消息后會(huì)調(diào)用對(duì)應(yīng)的方法。

     new這個(gè)消息的含義是: 創(chuàng)建一個(gè)對(duì)象(分配空間、成員變量初值為0)

示例代碼:

AMStudent *ps = [AMStudent new];


在OC中類(lèi)其實(shí)也是一種對(duì)象

     所以new這個(gè)消息是發(fā)送給類(lèi)這種對(duì)象的

     對(duì)應(yīng)方法我們稱(chēng)之為類(lèi)方法,和對(duì)象方法是不同的


  • 對(duì)象方法

要和函數(shù)區(qū)分:

     函數(shù)可直接調(diào)用,方法需要通過(guò)[]發(fā)送消息

     方法內(nèi)可以直接使用類(lèi)(對(duì)象)中的成員變量


沒(méi)有參數(shù)的方法:

    接口聲明: - (returnValueType) methodName;

    方法調(diào)用: [objName methodName]

- (void) showInfo;
- (AMStudentScoreLevel) getScoreLevel; //AMStudentScoreLevel是枚舉類(lèi)型


一個(gè)參數(shù)的方法:

     接口聲明:      - (returnValueType) methodName: (parType) parName;

     方法調(diào)用:      [objName methodName:argName];

/**
 設(shè)置學(xué)生的ID
 */
- (void) setId:(NSInteger) ID;


多個(gè)參數(shù)的方法:

     接口聲明:

     - (returnValueType) methodName1: (par1Type) par1Name

                                        methodName2:(par2Type) par2Name ...;

     方法調(diào)用:

     [objName methodName1:argName methodName2:arg2Name ...];

    蘋(píng)果公司鼓勵(lì)工程師使用這種句子一樣寫(xiě)法 ,即代碼本身具有注釋的部分功能

/**
 設(shè)置學(xué)生信息
 */
- (void) setInfoWithId:(NSInteger) identifier andWithName:(NSString*) name andWithAge:(NSInteger) age andWithScore:(NSInteger) score;


方法中的self關(guān)鍵字:

     是一個(gè)指針,指向當(dāng)前對(duì)象,即調(diào)用這個(gè)方法的對(duì)象

     注意:self指針的指向不能變化

     用途:

         成員變量(屬性)與參數(shù)名的區(qū)分

         獲得當(dāng)前對(duì)象的地址(如作為返回值)

         調(diào)用對(duì)象的其他方法

- (void)showInfo
{
    NSLog(@"[id:%ld][name:%@][age:%ld][score:%ld]", self->_id, self->_name, self->_age, self->_score);
}


description方法:

     任何一個(gè)類(lèi)都可以實(shí)現(xiàn)這個(gè)方法(無(wú)需聲明),該方法是由父類(lèi)NSObject繼承而來(lái)的

     該方法返回一個(gè)OC對(duì)象類(lèi)型NSString

     在NSLog()函數(shù)打印時(shí),指定%@,將自動(dòng)調(diào)用該方法并打印返回的字符串。

- (NSString *)description
{//重寫(xiě)的NSObject的方法,%@輸出的就是返回的字符串
    NSString * p = [NSString stringWithFormat:@"AMStudent : [id:%ld][name:%@][age:%ld][score:%ld]", self->_id, self->_name, self->_age, self->_score];
    
    return p;
}



  • 接口的源文件擴(kuò)展

在類(lèi)的源文件的@implementation之前添加一個(gè)接口的擴(kuò)展,是聲明內(nèi)部方法、成員變量、屬性的常見(jiàn)做法

在接口擴(kuò)展中聲明的內(nèi)容將不對(duì)外開(kāi)放,僅允許在該類(lèi)的源文件內(nèi)部使用

語(yǔ)法:在@implementation前

    @interface 類(lèi)名 ()

     ...

     @end




向AI問(wèn)一下細(xì)節(jié)

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

AI