OC課程筆記總結8 核心語法3 構造方法

2021-07-02 07:50:23 字數 2805 閱讀 7017

課程:核心語法

首先必須理解兩個重要的內容:1,self,2,super

self,永遠指向的是當前的物件,而判斷當前物件到底是哪乙個是通過最外層的中括號中是哪乙個物件,而不是某個方法或者屬性所屬於的類或者物件。

這一點體現在 self = [super init] 中,super是指呼叫父類的方法init,這個方法返回乙個self,而整個語句是 【子類物件 init】 呼叫了子類的init方法,而子類的init方法中有這麼一句【self= 【super init】】 ,最後是return self,

因此,最外層的呼叫者是 子類物件,所有在這一語句中所涉及到的所有self 都是指向子類物件。不論這個self是否是在父類的方法中或是其他。super只是表示呼叫的是父類的方法,並不是乙個指標,它只是乙個

告訴編譯器要呼叫父類方法的指示符。

構造方法是物件方法,必須由物件來呼叫,用於初始化物件屬性。new是類方法,用於建立物件,但在實際開發中不常用new方法,因為new 方法功能太單一

要完整的建立乙個可用物件實際分為兩步,第一步,分配儲存空間,第二部,初始化物件。在new方法中也是分別呼叫了兩個方法完成了這兩個步驟。

第乙個:+alloc,用於分配空間,第二個   - init 用於初始化。在實際開發中,通常使用其他的方法來初始化,+alloc是必須要用的。開發中常常使用中括號巢狀來簡化**書寫,因為可以

節省空間,不用建立那麼多變數儲存空間。實際 開發中建立物件的格式:

型別 *指標變數名 = 【【型別 alloc】 init】= 【型別 new】;

即 new 方法封裝了alloc 和init 這兩個方法。

預設的初始化值都是0,可以通過重寫init方法來定義初始化的值。init 方法是屬於nsobject類的物件方法。重寫乙個方法在implementation中重寫。在編譯器中,如果在implemetation中輸入乙個方法名

有系統提示,就說明這個方法已經宣告過了。重寫構造方法是有限制的,在重寫的init方法中,一定要呼叫super init 方法,首先預設初始化一次後,才能自定義初始化。初始化很重要的乙個目的是將物件中

的isa指標初始化,指向元類物件(包含類的類方法),獲取方法列表。isa是指標,預設值是0,在執行了init方法之後就會初始化指標,讓其指向當前類的元類(其實都是同乙個類)

在重寫init方法中有這麼一條語句  self = [super init],這條語句可以這樣理解:首先,這條**是寫在重寫的init方法中的,要自定義初始化物件,必須先用預設的方法初始化一次。而子類中的重寫了init方法,所以

如果用子類物件去呼叫init方法會變成乙個死迴圈,但是記住,只要子類繼承的了父類,一定會繼承父類所有的東西,即使重寫了init 方法,但是父類的init 方法還是存在於子類的儲存空間中,而使用super,則表示

使用的是父類的方法,來對當前的子類物件作用,並不是對父類作用的意思。方法的作用物件還是當前的子類。即super是指呼叫父類的方法,並不是指向父類的物件。

重寫init 方法的固定格式如下:

(id) init

if(self = [super init])

return self;

使用 super init 會 呼叫父類中的init 方法,如果在父類中也重寫了init 方法,即父類中也有 super init ,那麼還會繼續呼叫父類的父類的init 方法,最終知道呼叫了nsobject這個超類的init 方法,而nsobject

是閉源的,無法看到觀法的源**。而在使用到nsobject 中的init 方法時,會將isa指標直接指向當前的物件(而不是從父類到子類這樣一層一層改變),這個指向是動態監測的。可以直接讓其指向當前的子類物件。

子類從父類中所繼承的所有屬性在沒有執行到初始化方法之前,也就是在執行了alloc之後,還沒執行init,這段時間內,這個類的所有物件的屬性都是預設值0,包括指標isa,此時isa並沒有指向任何物件。

而在執行了init 方法後,這些屬性才會有自己的值,如果沒有重寫init 方法,那麼用到的是nsobject中的init 方法,這個方法可能只對乙個屬性初始化,就是isa,讓其指向當前的類。

在新建子類物件時,是否分配了兩塊記憶體空間?在oc中是沒有自動**機制的。

如果父類和子類中有相同的方法,呼叫的是子類自己的方法。

self是乙個指標,指向物件的isa指標,isa指標指向類物件(結構體,任何物件本質都是結構體),然後通過類物件的sel指標(指向code區的類)去類中尋找方法,找到就實現。每個物件都有幾個隱藏屬性的,例如superclass,retaincount,isa等等等等。找不到方法,就通過superclass指標(指向父類的物件)找父類的,如此類推,找到nsobject都找不到,那就沒有了。superclass才是指標,super 不是指標。

實際開發中建立新物件一般不寫new,用 型別 ×指標變數名 = 【【型別 alloc】init】來代替new。

自定義構造方法:

重寫init方法和自定義構造方法是不同的。構造方法即init 方法,自定義init方法可以加入引數,來初始化所需要的值。

init方法的命名是有規範要求的:

1.init方法一定是物件方法,用-號開頭;

2.返回型別必須是id;

3.方法名用initwith***xx 開頭,***x表示屬性名,即表示初始化哪個屬性。便於閱讀。

任何**都不重要重複做工,只要有了可以實現同一目標的**,都可以進行復用。要降低**之間的耦合性,而通過引數名來相聯絡的**耦合性很高,所以盡量不要涉及過多的屬性名,引數名。

如果只是通過方法名來耦合,如果在另乙個方法中有某些屬性名或者引數名修改了,並不需要修改另乙個方法名中的對應屬性或者引數名。

總之,降低**耦合度,對於可以實現同一功能的**進行多次復用,這樣的**才是優秀的**。

OC課程筆記總結9 核心語法4 分類

課程 核心語法 category 分類,類目,類別,在oc中經常使用。分類是依賴於類的,先有類再有分類。類和分類都是同一種類,而分類可以在這種類的基礎上進行一些方法的擴充,而不用通過繼承建立乙個新的類再進行擴充。注意的是分類只能擴充類的方法 類方法和物件方法都可以 不能擴充類的屬性。乙個類可以有多個...

學習筆記 OC核心語法

1 利用點語法替換set方法和get方法 方法呼叫 student stu student new stu setage 100 int age stu age 點語法 stu.age 100 int age stu.age 2 點語法的本質 其實點語法的本質還是方法呼叫 當使用點語法時,編譯器會自...

OC新語法總結

1.方法與順序無關 2.列舉繫結資料型別 enum typedef nsuinteger language 3.屬性不用寫 synthesize 4.語法簡化 4.1 nsnumber nsnumber value value 12345 value 123.45f value 123.45 val...