對象的初始化,便利初始化函數(shù),便利構(gòu)造器

對象的初始化

對象在被創(chuàng)建的時候需要在內(nèi)存分配一塊空間給他。因?yàn)閷ο笫怯深悓?shí)例化而來的,So初始話這塊內(nèi)存的結(jié)構(gòu)的時候,要用類中定義的實(shí)例變量結(jié)構(gòu)來構(gòu)造這塊內(nèi)存。

alloc是用來給對象進(jìn)行內(nèi)存的分配,分配完成后,返回這塊內(nèi)存的地址(使用alloc方法返回的是對象的地址)

alloc是繼承NSObject的類方法

在新創(chuàng)建的內(nèi)存中,所有的成員都會被初始化。
整形初始化為0;
浮點(diǎn)型初始化為0.0;
字符型初始化為‘\0’;
BOOL類型初始化為NO;
指針初始化為nil;

alloc只用于創(chuàng)建對象并初始化為默認(rèn)數(shù)值,如果需要設(shè)置我們需要的默認(rèn)值,需要用到init方法(init是實(shí)例方法)
創(chuàng)建一個項(xiàng)目用來實(shí)踐init

新建一個Student類

在student類的接口文件.h中做類的特征行為代碼

Student.h

在student類的實(shí)現(xiàn)文件.m中做類的具體實(shí)現(xiàn)

Student.m

當(dāng)中的if(self=[super init]) 里面的[super init]返回子類對象。
在這里的作用是初始化父類的實(shí)例變量。如果返回的是nil,說明父類沒有alloc初始化成功,也就無法alloc子類對象。
上面這段程序中,init方法返回當(dāng)前類的對象,返回的類型是id數(shù)據(jù)類型。

id數(shù)據(jù)類型是動態(tài)數(shù)據(jù)類型,可以指向任何類的對象,不關(guān)心指向的類型,在運(yùn)行時才會檢查具體類型。
可以向id類型對象發(fā)送任何存在的消息。

對初始化分析之后下一步進(jìn)行對象的創(chuàng)建
在mian.m文件中

main.m
輸出

此時看init給對象初始化的過程
再新建一個stu2對象,同樣的給對象進(jìn)行初始化和方法調(diào)用

main.m

輸出

輸出

分別調(diào)用sayHi方法,輸出結(jié)果一樣,因?yàn)樵趇nit方法中對stu1和stu2進(jìn)行了同樣的初始化修改

Student.m

So
當(dāng)然輸出結(jié)果當(dāng)然一樣了。


程序在實(shí)際使用過程中,對象和對象的實(shí)例變量的值不一定相同,這個時候可以在init方法調(diào)用的時候傳入一個我們需要的數(shù)據(jù)。
于是便有

便利初始化函數(shù)

框架類庫中有一些init開頭的方法,都是便利初始化函數(shù)
如官方文檔中每個數(shù)據(jù)類型都有init方法

數(shù)據(jù)類型部分截圖

每種數(shù)據(jù)類型都有各自的處理數(shù)據(jù)的init方法

部分截圖

如圖方框的都是對NSSring類型的init方法
NSSring類型的中的intWithString是對字符串的的初始化。
intWithFormat是對個數(shù)進(jìn)行初始化
初始化方法都是init開頭來命名
以上這些都是框架提供的便利初始化函數(shù)。

框架提供的初始化方法不一定都適用我們的需求,
So我們同樣可以在類中定義自己的便利初始化函數(shù)。

在此,進(jìn)行便利初始化函數(shù)的實(shí)踐
開始,新建一個項(xiàng)目

新建項(xiàng)目

添加一個類

新建類
類名Student,繼承NSObject

現(xiàn)在開始在類中定義自己的便利初始化函數(shù)

在類的接口文件.h文件中

Student.m

以上的接口文件.h中有兩個初始化方法,為了使用過程中的方便,類中初始化方法是允許有多個的。

然后在類的實(shí)現(xiàn)文件.m中

只要的接口文件.h中有寫便利初始化函數(shù)。在實(shí)現(xiàn)文件.m中編輯初始化函數(shù),或者是方法的編寫,IDE都會有相應(yīng)的提示,這樣也能再編程過程中,檢驗(yàn)我們寫得方法名有沒有相互的對應(yīng)。

Student.m
Student.m

以上具體實(shí)現(xiàn)文件.m中主要寫實(shí)例對象的初始化,還有具體的方法的實(shí)現(xiàn),在一個便是需要用到的便利初始化函數(shù)。

在此文件中的便利初始化函數(shù),根據(jù)用戶傳進(jìn)來的參數(shù)值來進(jìn)行初始化實(shí)例變量的值。
name=[aName copy]是對aName地址中的數(shù)據(jù)進(jìn)行復(fù)制。也就是說復(fù)制后,name也是用的aName存數(shù)據(jù)的地址。(淺拷貝)

so
便利初始化化函數(shù)會比init方法中的初始化函數(shù)更加的靈活方便。

最后在main.m文件中代用上面寫得便利初始化函數(shù)

在寫的過程中記得頭文件的導(dǎo)入
只要有導(dǎo)入頭文件,在使用便利初始化函數(shù)時便有編輯的提示。

mian.m
mian.m

1.創(chuàng)建的第一個對象只使用了初始化,輸出便是我們在init方法中初始化的的數(shù)據(jù)(名字:學(xué)生 和 年紀(jì): 18 )
2.第二個對象使用了姓名的initWithName方法。因此只是把名字的實(shí)例變量值改變了。年紀(jì)的數(shù)值還是int類型的初始化值。
3.第三個對象使用了姓名和年紀(jì)的initWithName age 方法。名字和年紀(jì)都會有參數(shù)值傳進(jìn)去改動初始化的實(shí)例變量值。

通過不同的便利構(gòu)造函數(shù)創(chuàng)建類對象,然后調(diào)用使用對象的方法,可以得到不同的結(jié)果。
到此,可發(fā)現(xiàn)便利初始化函數(shù)比便利構(gòu)造器能能更好的個性化我們對數(shù)據(jù)的使用。
但是便利初始化函數(shù)創(chuàng)建對象的時候,還是同樣的先調(diào)用alloc方法給對象分配內(nèi)存空間,然后用我們需要的數(shù)據(jù)來初始化。

OC還有一種更方便的方法,把內(nèi)存的分配和初始化組合來完成對象的創(chuàng)建。


便利構(gòu)造器

便利構(gòu)造器都以className開頭,(類名首寫字母開頭),并且都是類方法。
如:

+(id)stringWithCString(const char *)cSring encoding(NSStingEncoding)enc;
+(id)stringWithFormat(NSString *)format,...;

以上兩個都是NSString類的便利構(gòu)造器。

現(xiàn)在實(shí)踐做一個便利構(gòu)造器
創(chuàng)建一個項(xiàng)目新建一個Student類同樣繼承NSObject
在類的接口文件.h中

Student.h

在類的實(shí)現(xiàn)文件.m

Student.m

在此文件中,便利構(gòu)造器其實(shí)就是分配內(nèi)存和初始化封裝在一起。

最后在 main.m文件中實(shí)現(xiàn)輸出
分別新建四個對象,使用

1.便利構(gòu)造器
2.便利初始化函數(shù) 姓名和年紀(jì)
3.便利初始化函數(shù)姓名
4.init初始化方法

便利構(gòu)造器
重寫的init初始化
main.m
輸出

便利初始化函數(shù)和便利構(gòu)造器的功能是一樣的。
便利構(gòu)造器只是把內(nèi)存和初始化封裝到了類的具體實(shí)現(xiàn)文件.m中而已。

初始化器和便利構(gòu)造器對比

總結(jié):
1.類是一組具有相同的屬性行為的對象的集合。
對象擁有的特征稱為類的屬性,對象的行為稱為累的類的方法。
2.對象的屬性和行為封裝在類中,不能分割。
3.Objective-C 中的類包含兩個部分:在.h文件中@interface 接口部分和.m文件中@imolementation具體時實(shí)現(xiàn)函數(shù)。
4.實(shí)例化對象就是進(jìn)行實(shí)例變量的賦值和方法的調(diào)用。
5.實(shí)例方法和類方法的區(qū)別。
-減號開頭為實(shí)例方法,需要實(shí)例化對象后通過對象進(jìn)行調(diào)用。實(shí)例方法允許調(diào)用實(shí)例方法和實(shí)例變量。
-加號開頭為類方法,不需要實(shí)例化對象,直接通過類來調(diào)用。
類方法使用的規(guī)范:
-類方法可以調(diào)用類方法
-類方法不能調(diào)用實(shí)例方法,但是類方法可以通過創(chuàng)建對象來訪問實(shí)例方法。
-類方法不可以使用實(shí)例變量。類方法可以使用self,因?yàn)閟elf不是實(shí)例變量。
-類方法作為消息,可以被發(fā)送到類中,不能發(fā)送大對象中。(可以用類調(diào)用類方法,不能用對象調(diào)用類方法)
6.對象的初始化
-用init alloc直接的初始化對象(就是開辟一塊空間給對象)
-用便利初始化函數(shù)初始化對象并給一個起始的值
-用便利初始化器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方文檔 初始化 Initialization是為準(zhǔn)備使用類,結(jié)構(gòu)體或者枚舉實(shí)例的一個過程。這個過程涉及了在實(shí)例里...
    hrscy閱讀 1,208評論 0 1
  • 本章將會介紹 存儲屬性的初始賦值自定義構(gòu)造過程默認(rèn)構(gòu)造器值類型的構(gòu)造器代理類的繼承和構(gòu)造過程可失敗構(gòu)造器必要構(gòu)造器...
    寒橋閱讀 843評論 0 0
  • 123.繼承 一個類可以從另外一個類繼承方法,屬性和其他特征。當(dāng)一個類繼承另外一個類時, 繼承類叫子類, 被繼承的...
    無灃閱讀 1,499評論 2 4
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,436評論 1 6
  • 1、用簡單的主體表達(dá)簡單的主題 攝影在許多場合需要做合理的減法,而留白技術(shù)的運(yùn)用是減法的具體體現(xiàn)之一,霧霾天為拍攝...
    氫Sir閱讀 509評論 0 1

友情鏈接更多精彩內(nèi)容