溫馨提示×

溫馨提示×

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

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

07.自定義構(gòu)造方法和description方法

發(fā)布時間:2020-07-21 20:32:19 來源:網(wǎng)絡(luò) 閱讀:428 作者:forest馮宋林 欄目:開發(fā)技術(shù)


一、自定義構(gòu)造方法

默認(rèn)的構(gòu)造方法,也就是init方法,它是不接收任何參數(shù)的。因此,在實際開發(fā)中,為了方便,會經(jīng)常自定義構(gòu)造方法。

接下來,自定義一個構(gòu)造方法,可以傳入一個age參數(shù)來初始化Student對象

1.在Student.h中添加方法聲明

- (id)initWithAge:(int)age;

* 構(gòu)造方法的方法名一般都會以init開頭,返回值跟init方法一樣為id類型,id可以代表任何OC對象

*個構(gòu)造方法接收一個int類型的age參數(shù),目的是在初始化Student對象時,順便設(shè)置成員變量_age的值

 

2.在Student.m中實現(xiàn)構(gòu)造方法

#warming 這里的W必須要大寫

1.-(id)initWithAge:(int)age{

2     self = [super init];

2     self = [super init];

3     if (self != nil) {

4         _age = age;

5     }

6

return self;

7 }


* 跟Java一樣,構(gòu)造方法內(nèi)部首先要調(diào)用父類的構(gòu)造方法,在第2行調(diào)用了父類的init方法,它會返回初始化好的Student對象,這里把返回值賦值給了self,self代表Student對象本身

* 第3~5行的意思是:如果self不為nil,也就是初始化成功,就給成員變量_age進行賦值

* 最后返回初始化過后的self,整個構(gòu)造方法就結(jié)束了

3.簡化構(gòu)造方法

由于C語言和OC的語法特性,我們可以對構(gòu)造方法進行簡化,先簡化第3行


1 - (id)initWithAge:(int)age {
2     self = [super init];
3     if (self) {
4         _age = age;
5     }
6     return self;
7 }


* 第3行的 if(self) 跟 if(self!=nil) 是等價的

* 還可以將第2、3行合并,繼續(xù)簡化


1 - (id)initWithAge:(int)age {
2     if ( self = [super init] ) {
3         _age = age;
4     }
5     return self;
6 }


* 第2行的總體意思是:先調(diào)用父類的構(gòu)造方法init,然后將返回值賦值給self,接著判斷self是否為nil

* 以后的構(gòu)造方法都這樣寫了

 

4.調(diào)用構(gòu)造方法

1 Student *stu = [[Student alloc] initWithAge:10];
2 
3 NSLog(@"age is %i", stu.age);
4 
5 [stu release];

* 在第1行調(diào)用了構(gòu)造方法initWithAge:,并傳入10作為參數(shù),因此Student對象的成員變量_age會變?yōu)?0

* 在第3行打印Student的成員變量_age,打印結(jié)果:

age is 10

 

二、description方法

1.NSLog回顧

眾所周知,我們可以用NSLog函數(shù)來輸出字符串和一些基本數(shù)據(jù)類

1 int age = 11;2 NSLog(@"age is %i", age);

* 第2行的%i代表會輸出一個整型數(shù)據(jù),右邊的變量age會代替%i的位置進行輸出

* 輸出結(jié)果:

  age is 11

 

2.NSLog輸出OC對象

其實,除了可以輸出基本數(shù)據(jù)類型,NSLog函數(shù)還可以輸出任何OC對象

1 Student *stu = [[Student alloc] initWithAge:10];
2
3 NSLog(@"%@", stu);

5 [stu release];

* 在第3行用NSLog函數(shù)輸出stu對象,注意左邊的格式符%@,以后想輸出OC對象,就得用%@這個格式符

* NSLog函數(shù)一旦發(fā)現(xiàn)用%@輸出某個OC對象時,就會調(diào)用這個對象的description方法(這個方法返回值是NSString類型,是OC中的字符串類型),并且將description方法返回的字符串代替%@的位置進行輸出

* description方法的默認(rèn)實現(xiàn)是返回這樣的格式:<類名: 對象的內(nèi)存地址>,因此上面代碼的輸出結(jié)果為:

Student: 0x100109910>

Student是類名,0x100109910是對象的內(nèi)存地址

* 注意了,%@只能用于輸出OC對象,不能輸出結(jié)構(gòu)體等其他類型

* 有Java開發(fā)經(jīng)驗的人應(yīng)該能感受到OC中的description方法就是Java中的toString方法

 

3.重寫description方法

description方法的默認(rèn)實現(xiàn)是返回 類名和對象的內(nèi)存地址,這樣的話,使用NSLog輸出OC對象,意義就不是很大,因為我們并不關(guān)心對象的內(nèi)存地址,比較關(guān)心的是對象內(nèi)部的一些成變量的 值。因此,會經(jīng)常重寫description方法,覆蓋description方法的默認(rèn)實現(xiàn)

比如,重寫Student的description方法,返回成員變量_age的值

1 - (NSString *)description {
2     return [NSString stringWithFormat:@"age=%i", _age];
3 }

* 在第2行調(diào)用了NSString這個類的靜態(tài)方法stringWithFormat初始化一個字符串對象,并返回這個字符串

* 如果你會使用NSLog的話,那就應(yīng)該能理解第2行的方法參數(shù)是什么意思了

* 假如_age是10,那么description方法返回的字符串就是@"age=10"

* 可能有人會覺得奇怪,之前創(chuàng)建的Student對象是需要釋放的,為什么這里創(chuàng)建的字符串對象不用釋放?要想徹底明白這個問題,需要先了解OC的內(nèi)存管理,這里我們暫不做詳細(xì)討論,后面會有章節(jié)詳細(xì)討論內(nèi)存管理。你可以先記住一個規(guī)則:一般情況下,靜態(tài)方法返回的對象,都不用手動釋放。

* 重寫完description方法后,再次執(zhí)行下面的代碼

1 Student *stu = [[Student alloc] initWithAge:10];2 3 NSLog(@"%@", stu);4 5 [stu release];

輸出結(jié)果為:

2013-04-19 22:09:56.625 構(gòu)造方法[531:303] age=10

 

4.description方法的陷阱

千萬不要在description方法中同時使用%@和self,下面的寫法是錯誤的:

1 - (NSString *)description {
2     return [NSString stringWithFormat:@"%@", self];
3 }

第2行同時使用了%@和self,代表要調(diào)用self的description方法,因此最終會導(dǎo)致程序陷入死循環(huán),循環(huán)調(diào)用description方法

向AI問一下細(xì)節(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