IOS學習 OC基礎學習4

2021-06-26 13:01:31 字數 4931 閱讀 9773

點語法:

person類中有_age乙個成員變數;

設定成員變數_age的值:

person *p = [person new]

p.age = 10;[p setage:10];

獲取成員變數的值:

int a = p.age;[p age];

根據有無賦值判斷是get方法還是set方法

點語法的本質還是方法呼叫(可通過在set和get方法中設定驗證語句驗證)

成員變數作用域:

當類在宣告成員變數時加入@public,那麼在任何地方都可以直接訪問物件的成員變數

當類在宣告成員變數時加入@private,那麼不允許直接訪問類的成員變數只能使用set和get方法(只能在當前類的方法物件方法中直接訪問)

當類在宣告成員變數時加入@protected,那麼只能在當前類和子類的物件方法中直接訪問(預設為protected)

類的成員變數 既可以在.h(宣告檔案)檔案中宣告 也可以在.m(實現檔案)檔案中宣告。但是在.h檔案中宣告預設是protected而在.m檔案中宣告預設是privated型別(也可以通過setter和getter方法訪問)(注意:成員變數名不能與宣告檔案中的成員變數名相同)(原因:其他檔案無法import.m檔案因此其他檔案無法使用該成員變數)

@property int age;相當於生成age的set和get方法;

@synthesize  age(方法宣告名) = _age(成員變數名):

自動生成@property宣告 age的setter和getter方法,並且會訪問—_age這個成員變數

也可以同時實現幾個方法

@synthesize age=_age,name=_name;

@synthesize age=_age,name=_name;

執行此句時會訪問_speed這個成員變數,如果不存在,就會自動生成@private型別的_speed變數

缺點:自動生成的型別為private型別

注意:如果寫為:

1、@synthesize age;則會自動生成名字為age(不是_age)的成員變數的set和get方法

2、如果@implementation中已經有了set和get方法 在使用@synthesize時不會自動生成以_下劃線開頭的成員變數

id型別:

萬能指標,能指向\操縱任何oc物件

id d = [person new];//注意id後面沒有*號

相當於nsobjct *o = [person new]; // 多型  id = nsobject*

id 相當於可以指向任何乙個nsobjct的子類,形成類似多型的形式

構造方法:

person *p = [person new];

完整的 建立乙個可用物件

1.分配儲存空間 +allo

2.初始化 -init 

1、呼叫+alloc分配儲存空間

person *p = [person alloc];

2、呼叫-init進行初始化

person *p2 = [p1 init];

1+2 = person *p = [person new];

也可以寫為:person *p3 = [[person alloc] init];

以後建立新的物件不要在用new了 改為兩步走

構造方法:用來初始化的方法,是乙個構造方法(-開頭)

重寫構造方法:

例子:重寫init方法

- (id)init

//3、返回乙個已經初始化完畢的物件

return self;

}可以簡寫為

- (id)init

return self;

}總結:

重寫構造方法的目的:

為了讓物件建立出來,成員變數就會有一些固定的值

重寫構造方法的注意點:

1、先呼叫父類的構造方法(self = [super init])

2、在進行子類內部成員變數的初始化

自定義構造方法:

1、一定是物件方法,一定以-開頭

2、返回值一般為id型別

3、方法名一般以init開頭

例子:- (id)initwithname:(nsstring*)name;

- (id)initwithname:(nsstring*)name

return self;

}呼叫:person *p = [[person alloc] initwithname:@"rose"];

寫程式時:能呼叫原來的程式就不要重複寫原來的**!

誰宣告的變數由誰來進行賦值

父類的屬性(成員變數)交給父類來處理,子類方法處理子類自己的屬性(成員變數)

分類(category )(類別、類目):

可以給某個類擴充一些方法(不修改原來的**)

//宣告

@inte***ce 類名[分類名稱]

@end

//實現

@implementation 類名[分類名稱]

@end;

作用:在不改變原來類內容的基礎上 可以為類增加一些方法

使用注意:

1、不能擴充成員變數,只能新增方法

2、新增的分類中可以訪問成員變數

3、可以直接使用物件呼叫分類中的方法 分類-原來的類-父類

4、分類的優先順序最高,物件呼叫方法時優先在分類中查詢,因此如果分類中重寫類中的某個方法,會覆蓋掉原來類中的方法,從而導致原來的方法失效

5、方法呼叫優先順序:分類(最後參與編譯的分類優先)->原來類->父類

類的本質」

類也是乙個物件 是乙個class型別的物件 簡稱類物件

class 型別的定義

typedef struct objc class *class

class 建立 person類物件

利用person類物件  建立person型別的物件

person *p1 = [[person alloc] init];

person *p2 = [[person alloc] init];

//獲取記憶體中的類物件

class c = [p class];

class c2 = [p2 class];

c 與 c2是相同的

因為p1,p2都是person類的物件所以記憶體中的物件類相同

(類物件是否相同可根據物件中的isa的指向進行判斷)

另一種獲取記憶體中類物件的方法

class c3 = [person class];

最終搞得輸出結果 c =c2 = c3;

乙個類在記憶體中只有乙個儲存空間 我們稱其為類物件

類的載入順序:先載入父類 在載入子類

load方法:在類被載入的時候呼叫 只會被載入一次

initialize方法:當程式啟動的時候,會載入一次專案中所有的類,類載入完畢後就會呼叫load方法

(面試內容)

load方法:程式一啟動,載入類的時候被呼叫,每個類呼叫一次

initialize方法:第一次用到這個類的時候被呼叫,總是先呼叫父類

總結:1、當程式啟動時,就會載入專案中所有的類和分類,而且載入後會呼叫每個類和分類的+load方法,只會呼叫一次、

2、當第一次使用某乙個類時,就會呼叫當前類的+initialize方法

3、先載入父類,在載入子類(先呼叫父類的+load方法,在呼叫子類的+load方法)

先初始化父類,在初始化子類(先呼叫父類的+initialize方法,在呼叫子類的+initialize方法)

description:

-description

person *p = [[person alloc] init];

nslog(@"%@",p);

執行上述第二句時:

1、會呼叫物件p的-description方法

2、拿到-description方法的返回值(nsstring*)顯示到螢幕上

3、-description方法預設返回值是 「類名+記憶體位址」

因此,要想通過nslog(@"%@",p)輸出p的相關資訊就要重寫

-description方法

+description:

class c = [person class];

nslog(@"%@",c);

執行上述第二條語句時

1、會呼叫類的+description方法

2、拿到+description方法的返回值(nsstring*)顯示到螢幕上

3、+description方法的預設返回值為「類名」

nslog的擴充套件輸出:

1、nslog(@"%d",__line__);輸出當前的行號

//nslog輸出c語言字串時 不能有中文

2、nslog(@"%s",__file__);輸出檔案路徑(檔案路徑中不能有中文)

3、nslog(@"%d",__line__);輸出當前函式或者方法名

self基本使用:

多種方法呼叫類中的方法

person *p = [[person alloc] init];

[p test2];

執行步驟:

基礎:先利用物件p中的isa指標 到person類中去尋找 test2方法

而 在person類中每乙個 方法都對應這乙個self類的資料(方法的位址)改位址存放於isa指標當中

具體步驟:

1、把test2包裝成sel型別資料

2、去isa中的sel位址 到person類中查詢對應的方法

3、根據方法位址呼叫相應的方法

呼叫方法的兩種方法:

1、直接呼叫

[p test];

第二種 利用sel=方法名位址

[p performselector:@selector(test2)];

第三種每個方法內部都會隱藏乙個_cmd 代表當前方法

總結:sel其實是對方法的一種包裝,將方法包裝秤乙個sel型別的資料,去找到相應的方法位址,找到方法位址就可以呼叫方法

IOS學習 OC基礎學習1

oc 在c的基礎上增加了一層最好的物件導向語法 副檔名.m 基本語法 1 關鍵字 基本上所有的關鍵字都是以 開頭 2 字串一 開頭 其他與法 引進了bool型別 yes,no nil 相當於c語言中的null,也是0 nslog hello nslog d 27 與 之間無空格,且輸出之後自動換行 ...

iOS開發學習筆記 OC基礎

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

IOS學習 C語言基礎學習4

函式 封裝乙個功能 1 什麼情況下定義函式 新增乙個常用的新功能 2 函式的定義格式 返回值型別 函式名 形式引數列表 1 形式引數 定義函式時函式名後面中的引數 2 實際引數 呼叫函式時,傳入的具體資料 3 如果是基本資料型別作為函式形參,純粹是值傳遞,修改函式內部形參的值,並不會影響外面的實參的...