成員變量名;對象與指針 這里沿用上篇objective-c面向對象之——類和對象(上)的代碼。 在 FKPersonTest.m中,有這樣的代碼: FKPerson* person = [[FKPe...">

IOS 開發學習總結 objectivec面向對象之——類和對象(下) -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【www.solarmaxlimited.com - 電腦資料】

    知識點安插:如果訪問權限允許,objective-c 允許直接通過對象來訪問成員變量,

IOS 開發學習總結 objectivec面向對象之——類和對象(下)

。語法格式:對象->成員變量名;

對象與指針

    這里沿用上篇objective-c面向對象之——類和對象(上)的代碼。

    在 FKPersonTest.m中,有這樣的代碼:

    FKPerson* person = [[FKPerson alloc] init];

    這行代碼產生了2個東西,一個是 person 變量,一個是 FKPerson 對象。這個FKPerson 對象被賦給person 變量。

    從類的定義來看,FKPerson對象包含3個成員變量(2個暴露,1個隱藏),成員變量是需要內存來存儲。因此,創建FKPerson對象時,必須有對應的內存來存儲FKPerson對象的成員變量。FKPerson對象在內存里的存儲示意圖:

   

    有圖可以看出,FKPerson對象由多塊內存組成,不同的內存塊存儲了不同成員變量。當把FKPerson對象賦值給FKPerson*變量時,其實是把FKPerson對象在內存中的首地址賦給了FKPerson*變量。FKPerson*類型的變量指向實際的對象。

    本質上說,類是一種指針類型的變量。因此,程序定義的FKPerson*類型只是存放一個地址值,它被保存在該 main()) 函數的動態存儲區,它指向實際的FKPerson對象,而真正的FKPerson對象存放在堆(heap) 內存里。如下示意圖:

   

    當一個對象被成功創建后,這個對象將保存在堆內存中,objective-c 不允許直接訪問堆內存中的對象,只能通過該對象的指針變量來訪問對象。就是說,所有的對象都只能通過指針變量來訪問它們。堆內存里的對象可以有多個指針,即多個指針變量可以指向同一個變量。

    如果堆內存里的對象沒有任何變量指向該對象,那么程序將無法再訪問該對象,如果程序員不釋放該對象所占用的內存,就會造成內存泄露。

self 關鍵字

    self 關鍵字總是指向調用該方法的對象。它的最大作用是:讓類中的一個方法訪問該類的另一個方法或成員變量。

    self 總是代表當前類的對象,當 self 出現在某個方法體中時,它所代表的對象是不確定的。但它的類型是確定的:它代表的對象只能是當前類的示例。當這個方法被調用時,它代表的對象才能確定下來:誰調用該方法,self 就代表誰。

    示例代碼:

    頭文件:FKDog.h

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKDog : NSObject// 定義一個jump方法- (void) jump;// 定義一個run方法,run方法需要借助jump方法- (void) run;@end</foundation></code>

    實現文件:FKDog.m

<code class="hljs" bjectivec="">#import FKDog.h@implementation FKDog// 實現一個jump方法- (void) jump{    NSLog(@正在執行jump方法);}// 實現一個run方法,run方法需要借助jump方法- (void) run{//  FKDog* d = [[FKDog alloc] init];//  [d jump];    [self jump];    NSLog(@正在執行run方法);}@end</code>

    FKDogTest.m文件:

<code class="hljs" java="">#import<foundation foundation.h="">#import FKDog.hint main(int argc , char * argv[]) {    @autoreleasepool{        // 創建Dog對象        FKDog* dog = [[FKDog alloc] init];        // 調用Dog對象的run方法        [dog run];    }}</foundation></code>

用self區分重名的局部變量和成員變量

    局部變量和成員變量重名的情況下,局部變量會隱藏成員變量,

電腦資料

IOS 開發學習總結 objectivec面向對象之——類和對象(下)》(http://www.solarmaxlimited.com)。為了在方法中強行引用成員變量,可以使用 self 關鍵字進行區分。

    示例代碼:

    FKWolf.h文件

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface FKWolf : NSObject{    NSString* _name;    int _age;}// 定義一個setName:ageAge方法- (void) setName: (NSString*) _name andAge: (int) _age;// 定義一個info方法- (void) info;@end</foundation></code>

    FKWolf.m 文件

<code class="hljs" bjectivec="">#import FKWolf.h@implementation FKWolf// 定義一個setName:ageAge方法- (void) setName: (NSString*) _name andAge: (int) _age{    // 當局部變量隱藏成員變量時,    // 可用self代表調用該方法的對象,這樣即可為調用該方法的成員變量賦值了。    self->_name = _name;    self->_age = _age;}// 定義一個info方法- (void) info{    NSLog(@我的名字是%@, 年齡是%d歲 , _name , _age);}@endint main(int argc , char * argv[]) {    @autoreleasepool{        FKWolf* w = [[FKWolf alloc] init];        [w setName: @灰太狼 andAge:8];        [w info];    }}</code>

把 self 當成普通方法的返回值

    當 self 作為對象的默認引用使用時,程序可以像訪問普通指針變量一樣訪問這個 self引用,甚至可以把 self 當成普通方法的返回值。

    示例程序:

    ReturnSel.m文件

<code class="hljs" bjectivec="">#import<foundation foundation.h="">@interface ReturnSelf : NSObject{    @public    int _age;}- (ReturnSelf*) grow;@end@implementation ReturnSelf- (ReturnSelf*) grow{    _age++;    // return self,返回調用該方法的對象    return self;}@endint main(int argc , char * argv[]){    @autoreleasepool{        ReturnSelf* rt = [[ReturnSelf alloc] init];        //可以連續調用同一個方法        [[[rt grow] grow] grow];        NSLog(@rt的_age成員變量的值是:%d , rt->_age);    }}</foundation></code>

    說明:使用 self 作為方法的返回值可以使代碼更加簡潔,但可能造成實際意義的模糊。

id 類型

    id 類型可以代表所有對象的類型。任意類的對象都可賦值給 id 類型的變量。

    通過 id 類型的變量來調用方法時,objective-c 將會執行動態綁定。動態綁定:objective-c 將會跟蹤對象所屬的類,會在運行時判斷該對象所屬的類,并在運行時確定需要動態調用的方法,而不是在編譯時確定要調用的方法。

    示例程序:

<code class="hljs" bjectivec="">#import<foundation foundation.h="">#import FKPerson.hint main(int argc , char * argv[]) {    @autoreleasepool{        // 定義id類型的變量,并將FKPerson對象賦給該變量        id p = [[FKPerson alloc] init];        // 使用p變量來調用say:方法。        // 程序將在運行時執行動態綁定,因此實際執行FKPerson對象的say:方法        [p say: @你好,瘋狂iOS講義];    }}</foundation></code>

最新文章
国产v亚洲v天堂无码网站,综合亚洲欧美日韩一区二区,精品一级毛片A久久久久,欧美一级待黄大片视频
玩两个丰满老熟女久久网 | 夜色福利院在线看 | 午夜福利国产精品视频 | 中文字幕精品视频在线观 | 亚洲AV乱码二区三区涩涩屋 | 天天爽一区二区三区 |