黑馬程式設計師 OC中類與物件 語法雜記

2021-07-05 08:41:55 字數 4853 閱讀 5393

------培訓 學習型部落格,請多指教-----------

簡單的說物件就是封裝了的資料和方法,類就是模版。

類載入:

當程式啟動時,會載入專案中所有的類和分類,而且載入後會呼叫每個類和分類的+load方法,而且只會呼叫一次。並且類一旦載入到記憶體,就不會被**,直到程式結束的時候才會被**。這個過程就叫做類載入。

當第一次使用某個類建立物件的時候,就會呼叫當前類的+initialize方法,也就是初始化物件,使建立出來的物件可以使用。

物件在記憶體之中是如何儲存的呢?我們這裡的p指標是在函式中宣告的,那麼p就是乙個區域性指標變數,也就是p變數儲存在棧空間中。比如:

int main()

new做了什麼事情?

1.申請空間

:在堆記憶體之中根據類的「模板」申請一塊合適大小的空間建立物件。類「模板」中有哪些屬性,就把這些屬性宣告在這塊空間之中。物件中宣告了類定義的所有的屬性和_isa指標和引用計數器(_isa指標指向**段中的類)。

2.初始化物件

:初始化這塊空間之中物件的屬性的值,就是為屬性賦預設值。

3.返回物件位址

通過指標訪問物件的屬性和方法?

1.訪問屬性:通過指標可以找到指標指向的堆空間中的物件,找到物件後就可以直接訪問物件的屬性。

2.呼叫方法:根據指標找到堆空間中的物件,在根據物件中的_isa指標找到**段中的類中的方法。

null是c中指標變數的值,代表這個指標不指向任何變數,這個時候null等價於0。

int *p = null;//等價於int *p = 0;

nil是oc中指標變數的值,代表這個指標不指向任何物件,這個時候nil等價於0。

person *p = nil;//等價於person *p = 0;

注意:

1.其實null和nil都是乙個巨集,並且巨集值都是0。只不過null是在c語言中宣告的巨集,nil是在oc中宣告的巨集。所以在使用的時候應該區分開來使用。在oc中盡量使用nil,c中只能使用null。

2.如果乙個類指標沒有指向任何物件,通過這個指標去訪問物件的屬性的時候會報錯。通過這個指標去呼叫方法的時候不會報錯,但是不會有任何回應。

1.#pragma mark 分組名

在導航欄顯示分組名

2.#pragma mark -

在導航欄顯示一條水平線

3.#pragma mark - 分組名

在導航欄顯示分組名,分組名上面加一條水平線

函式指的是c語言中的函式,方法指的是定義在oc類中的方法。

不同點:

1.函式除了不能定義在@inte***ce之中,可以定義在原始檔中其他的任意地方(建議不要寫在類中)。方法的宣告只能寫在@inte***ce中,方法的實現只能寫在@implementation中(語法強制要求)。

2.函式可以直接呼叫(函式是孤立的)。而方法只能建立物件,通過物件名來呼叫(方法歸屬於類或者物件)。

相同點:

1.無論是函式還是方法,他們都是封裝了乙個**塊,代表乙個單獨的功能。

如果我們開發乙個程式,不可能將所有的類都寫在同乙個原始檔,後期維護和團隊開發都非常不方便。所以我們需要分模組開發,並且每個模組包含兩個檔案,分別是類的宣告檔案和實現檔案。類的宣告寫在.h檔案,類的實現寫在.m檔案(類的實現裡也要引入類的宣告檔案),使用這個類之前用#import引入.h檔案就行了。

新建檔案的時候選擇cocoa class,檔名使用類名,就會同時建立類的宣告檔案和類的實現檔案。然後我們在.h檔案中寫類的宣告,在.m檔案中寫類的實現。例如:

person.h檔案

#import

@inte***ce person : nsobject

- (void)sayhi;

@end

person.m檔案

#import "person.h"

@implementation person

- (void)sayhi

@end

main.m檔案

#import

#import "person.h"

int main(int argc, const char * argv)

return 0; }

物件作為方法的引數

物件可以作為方法的引數,因為類的本質就是乙個資料型別。並且傳遞的時候是位址傳遞,相當於在方法中操作的引數和實參是同乙個物件。

gender.h檔案

//單獨在乙個標頭檔案中定義乙個性別列舉

typedef enumgender;

person.h檔案

#import

#import "gender.h"

@inte***ce person : nsobject

//人的打招呼方法宣告

- (void)sayhi;

@end

person.m檔案

#import "person.h"

@implementation person

//人的打招呼方法實現

- (void)sayhi

@end

god.h檔案

#import

#import "person.h"

@inte***ce god : nsobject

//上帝的打招呼方法宣告

- (void)sayhi;

//上帝殺死乙個人的方法宣告

- (void)killwithperson:(person *)person;

@end

god.m檔案

#import "god.h"

@implementation god

//上帝的打招呼方法實現

- (void)sayhi

//上帝殺死乙個人的方法實現

- (void)killwithperson:(person *)person

@end

main.m檔案

#import

#import "person.h"

#import "god.h"

int main(int argc, const char * argv)

return 0; }

物件作為方法的返回值

gender.h檔案

//單獨在乙個標頭檔案中定義乙個性別列舉

typedef enumgender;

person.h檔案

#import

#import "gender.h"

@inte***ce person : nsobject

//人的打招呼方法宣告

- (void)sayhi;

@end

person.m檔案

#import "person.h"

@implementation person

//人的打招呼方法實現

- (void)sayhi

@end

god.h檔案

#import

#import "person.h"

@inte***ce god : nsobject

//上帝的打招呼方法宣告

- (void)sayhi;

//上帝殺死乙個人的方法宣告

- (void)killwithperson:(person *)person;

//上帝造人的方法

- (person *)makepersonwithname:(nsstring *)name;

@end

god.m檔案

#import "god.h"

@implementation god

//上帝的打招呼方法實現

- (void)sayhi

//上帝殺死乙個人的方法實現

- (void)killwithperson:(person *)person

//上帝造人的方法

- (person *)makepersonwithname:(nsstring *)name

@end

main.m檔案

#import

#import "person.h"

#import "god.h"

int main(int argc, const char * argv)

return 0; }

物件可以作為類的例項變數,比如我們有乙個人類和乙個狗類,每乙個人擁有乙隻狗,那狗也是人的屬性了。比如:

dog.h檔案

#import

@inte***ce dog : nsobject

@property (nonatomic,copy) nsstring *name;//狗名

- (void)shout;//狗叫的方法宣告

@end

dog.m檔案

#import "dog.h"

@implementation dog

//狗叫的方法實現

- (void)shout

@end

person.h檔案

#import

#import "dog.h"

@inte***ce person : nsobject

@property (nonatomic,retain) dog *dog;//人的狗

@end

person.m檔案

#import "person.h"

@implementation person

@end

main.m檔案

#import

#import "person.h"

int main(int argc, const char * argv)

return 0; }

-------培訓 學習型部落格,請多指教-------------------------

黑馬程式設計師 OC 類和物件

類名 car 屬性 輪胎個數 時速 行為 跑 因為使用了nsobject import 完整地寫乙個函式 函式的宣告和實現 完整的寫乙個類 類的宣告和實現 類的宣告 宣告物件的屬性 行為 nsobject 的目的是 讓car這個類具備建立物件的能力 inte ce car nsobject 用來宣告...

黑馬程式設計師 OC 類和物件

一.物件導向和面向過程的思想 對比 oc是物件導向的,c是面向過程的。物件導向和面向過程只是解決問題的兩種不同思想 1 以用電腦聽歌為例子 a 面向過程 開啟電腦 關閉電腦 b 物件導向 不是相親的 物件 電腦 開機 關機 區別分析 面向過程關注的是解決問題需要哪些步驟 物件導向關注的是解決問題需要...

黑馬程式設計師 OC基本語法

oc是c系列語言,是物件導向的語言,而c語言是面向過程的,那麼首先要理解物件導向和面向過程的區別。面向過程是專注 事件 本身,這件事從發生到結束的行為。例如怎麼把大象裝進冰箱,面向過程的思想是這樣的,首先開啟冰箱門,把大象裝進去,然後把冰箱門關上。而物件導向是專注於 事物 本身的,同樣是裝大象,物件...