OC基礎筆記2

2021-07-25 09:14:56 字數 2837 閱讀 3641

25,在.h檔案中定義的成員變數能直接被別人看到,如果不想被看到,可以定義在.m檔案的實現中,成為私有變數,並且只能自己呼叫(本類使用)。寫法和常規定義一樣。

定義乙個私有方法,是不被宣告的方法,不能被直接呼叫,需要id型別的指標,和訊息選擇器等間接呼叫。

26,@property也是編譯器指令,在編譯時自動生成seigei方法的宣告,基本寫法:@property int age;    

27,@synthesize則在編譯時自動生成seigei方法的實現,基本寫法: @synthesize age =_age   賦值以及返回的都是等號後面的屬性。如果等號後面沒有寫,那麼預設是返回和賦值它本身

28,4.4系統之後的xcode,可以只用@property就可以同時宣告和實現,還可以自動生成相應的例項變數(生成的是私有屬性)。想要改setget方法,重寫就可以了。若

兩個方法都重寫,那麼就不會自動生成私有屬性,等同@property失效。

29,@property的修飾符,修飾屬性可讀可寫,非線性等特性,有readonly,readwrite(

預設),如果要改自動生成的getset的方法名稱,可以加上(getter/setter=***)做為其中乙個修飾符。

常用的特例:bool型別如果要改get方法的名稱,要在新名稱前加上is:(getter=is***)

30,動態資料型別id型別,在編譯時才知道它指的是誰。(靜態型別是資料有指定(所屬)型別的),動態型別常用於多型方法的優化。在方法中id型別的形參可以傳遞任何型別的類,只要傳遞了誰源型別就被它所代替。雖然nsobjec也可以接收任何物件,但卻不會被代替,屬於靜態的。實現:乙個方法,多個類使用。

31,動態型別還可以直接呼叫私有方法(沒有宣告的方法),而且可能呼叫到不屬於自己的方法(在專案範圍內),編譯時又不報錯。可以用if來先判斷是否含有此方法,再呼叫 iskindofclass:[***  class] 來 檢查id型別物件是否是含那個方法的類或者子類,或者用 ismemberofclass:[*** class] 是否是含那個方法的類的例項物件。如果是,那麼就屬於擁有這個方法,編譯通過。

33,類新建的物件都等同乙個結構體,所以id型別也是乙個結構體型別

34,id型別所建立的物件,在賦值屬性時不要用點語法,因為點語法是編譯特性,而

id是執行時的特性,程式是先編譯後執行,而點語法是在建立物件之後才用到,順序不對會執行出錯。

35,在新建乙個物件時,

系統會根據**區的內容先在堆中建立乙個類物件,呼叫new中包含的+allco方法,分配乙個堆記憶體建立乙個含有 isa變數 的物件,通過isa指向類物件,來獲取例項並將所有例項變數的值設定為零, 最後返回此物件的記憶體位址,用乙個區域性變數(只能放在棧中)去接收這個位址,在棧中儲存起來備用。

35,類物件是一種資料結構,儲存類的基本資訊:類的大小、名稱、版本、繼承層次、訊息(方法),函式的對映表等。例項是由類物件生成的。

36,沒有修改init方法 (沒有進行設定初始化的值時),init方法為空,所以初始化預設為零,也預設返回self的位址。init是乙個專用於賦值的方法

37,構造方法,使呼叫者在初始化的時候直接擁有一些屬性或值,通常在需要新建物件時使用,例如init方法

38,構造方法有蘋果規定的寫法,要先成功初始化父類[super init]並返回位址給自己self,才能用這個返回的位址去初始化子類的屬性(呼叫者本身)......,最後return self這個位址,就能呼叫設定改的子類的初始化了

39,每次初始化時都會呼叫父類的初始化,因為這樣子類才能擁有父類的屬性。但如果父類已經有了初始化的設定,那麼子類不改動的話就會繼續沿用。(用自定義方法改善)

40, instancetype也是萬能指標,5.5之後的系統init方法的返回值型別主要用它而不是id。當返回的位址被接收時,在編譯時就檢查新建物件的真實型別和接收者的型別是否一致,在

執行之前就能知道對錯,方便調整。但它只能用在返回值型別,不像id那麼多功用。

41,自定義構造方法:以init開頭的帶有屬性形參的方法,物件呼叫時直接初始化其中的屬性age。可以多個構造,也可以多個引數,相對靈活。

42,子類初始化時,如果同時需要初始化父類的屬性以及自己的屬性,也可以通過super呼叫父類的自定義構造方法來初始化,減少重複寫**

43,new也稱為類工廠方法,類工廠方法用於快速建立物件的類方法,以類名為方法名的開頭,返回值也是id或instancetype,內部也就是建立物件的方法,返回的是新物件和位址,和new差不多,把建立物件以及初始化的一整套方法都封裝了起來,節省**。

44,也就是一般情況下,可以用new,自定義構造allco和init,類工廠,這三種來建立物件。都是蘋果的規範方法,通用的。

45,自定義類工廠方法時,內容要盡量使用self,以防止子類繼承並呼叫時出現語法錯誤,子類用來接收父類的物件就很容易出錯。

46,類的本質:每乙個例項物件instance of subclass都有乙個isa指標,而類物件class的isa指向它的元類物件meta,存著所有物件方法,而元類物件也有isa指標,指向它的根元類物件root (meta),放能建立物件的方法以及類方法, 而它的isa是指著自己的。建立物件的順序:**區,類物件,元類物件,根元類物件。nsobject就是根元類物件

47,類方法是在元類物件中存放,由類物件拿來呼叫;而物件方法是在類物件中存放,由例項物件拿來呼叫。而例項物件要先建立才能呼叫方法,而類物件一開始就自動生成,所以物件方法耗效能一些。

48,乙個類物件有父類,那麼類物件的元類物件就是其父類的元類物件的子類。

49,類的啟動過程:載入**到記憶體,同時呼叫類方法load啟動,再用類方法initialize用來建立類物件(可以順便批量初始化),都是只呼叫一次。

50,每次建立新物件時,都是先建立父類的類物件,除了nsobject。

OC基礎語法 2

oc當中塊的思想 塊是c,objective c和c 等程式語言中的高階功能,它允許建立不同的 段,這些 段可以傳遞給方法或函式,就像它們是值一樣。塊是objective c物件,因此它們可以新增到nsarray或nsdictionary等集合中。它們還能夠從封閉範圍中捕獲值,使其類似於其他程式語言...

OC加強筆記2

1.快速初始化乙個物件,並且加入自動釋放池。1 自定義構造方法 1 先初始化父類,並判斷是否初始化成功。2 初始化子類。3 返回self。2 定義類方法 instancetype initwithname nsstring name 返回self return self instancetype p...

iOS開發學習筆記 OC基礎

for int i 0 i items count i for nsstring item in items 快速列舉的限制 如在迴圈體中增加或刪除物件,則不能使用快速列舉,這時只能用for迴圈。nslog函式負責將指定字串輸出到xcode控制台。nslog的實參個數並不確定,但第乙個實參是必須的,...