對象的初始化
對象在被創(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類的接口文件.h中做類的特征和行為代碼

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

當(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文件中


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

輸出

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

So
當(dāng)然輸出結(jié)果當(dāng)然一樣了。
程序在實(shí)際使用過程中,對象和對象的實(shí)例變量的值不一定相同,這個時候可以在init方法調(diào)用的時候傳入一個我們需要的數(shù)據(jù)。
于是便有
便利初始化函數(shù)
框架類庫中有一些init開頭的方法,都是便利初始化函數(shù)
如官方文檔中每個數(shù)據(jù)類型都有init方法

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

如圖方框的都是對NSSring類型的init方法
NSSring類型的中的intWithString是對字符串的的初始化。
intWithFormat是對個數(shù)進(jìn)行初始化
初始化方法都是init開頭來命名
以上這些都是框架提供的便利初始化函數(shù)。
框架提供的初始化方法不一定都適用我們的需求,
So我們同樣可以在類中定義自己的便利初始化函數(shù)。
在此,進(jìn)行便利初始化函數(shù)的實(shí)踐
開始,新建一個項(xiàng)目

添加一個類


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

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


以上具體實(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ù)時便有編輯的提示。


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中

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

在此文件中,便利構(gòu)造器其實(shí)就是分配內(nèi)存和初始化封裝在一起。
最后在 main.m文件中實(shí)現(xiàn)輸出
分別新建四個對象,使用
1.便利構(gòu)造器
2.便利初始化函數(shù) 姓名和年紀(jì)
3.便利初始化函數(shù)姓名
4.init初始化方法




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

總結(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ù)初始化對象并給一個起始的值
-用便利初始化器