天天看點

objective-c 文法快速過(1)

有一定 c++或者 java 基礎,過一遍 oc 文法即可,都是相通的,個人認為難點是 oc 的記憶體管理,雖然有了 arc,但是也需要學習下,因為有舊軟體的維護。

建立在c語言的基礎上,增加了一層小範圍的面向對象的文法(保留了面向對象最精華的部分,oc的内容沒有java多,而java的内容沒有c++多,c++的内容最為繁雜),oc完全相容c語言,c和oc可以混編。可以在oc代碼中混入c語言代碼(前提是oc源檔案擴充名是.m),甚至是c++代碼(不是所有的源檔案都能包含c++代碼,隻有源檔案擴充名是.mm的源檔案可以包含c++代碼)。

可以使用oc開發mac os x平台和ios平台的應用程式

關鍵字

基本上所有關鍵字都是以@開頭,一些常見的關鍵字

@interface、@implementation、@end、@public、@protected、@private、@selector、@try、@catch、@throw、@finally 、@protocol、@optional、@required、@class、@property、@synthesize、@dynamic、self、super、id、_cmd、__block、__strong、__weak

字元串以@開頭

比如@"hello"是oc中的字元串,而"hello"則是c語言中的字元串,其中,@和字元串必須緊挨着。

注釋

注釋的文法和c 一樣。

nil

oc 中的 nil 相當于 c 和 c++的null 

oc程式的開發過程

編輯,編譯,連結(把所有的互相關聯的.o檔案合并在一起,加上函數庫),運作。

和c類似,先編寫.m檔案(檔案名可以是中文),然後編譯器編譯,連結,運作。

objective-c 文法快速過(1)

nslog與printf的差別

1、nslog接收oc字元串作為參數,printf接收c語言字元串作為參數

2、nslog輸出後會自動換行,printf輸出後不會自動換行

3、使用nslog需要#import <foundation/foundation.h>,裡面有nslog函數的聲明。不需要刻意記憶,想不起來,就編譯,出錯就會提示缺少什麼。

4、可以隻包含架構的主頭檔案,效果等價包含了這個架構裡的所有的頭檔案。頭檔案在xcode裡面,路徑很深,不好找。使用printf需要#include <stdio.h>

#import的作用(預處理)

1、跟#include一樣,用來拷貝某個檔案的内容

2、可以自動防止檔案内容被拷貝多次,也就是頭檔案中不用和c一樣,加入下面的預處理指令了

foundation架構的作用

開發ios、mac程式必備的架構,此架構中包含了很多常用的api。架構中包含了很多頭檔案,若想使用整個架構的内容,包含它的主頭檔案即可

相當于#include 導入頭檔案 也有兩種查找方式< ... > 和" ... "。

當包含一個頭檔案,編譯時,需要找到那個頭檔案,使用< >這種方式,編譯器查找的時候,會在編譯器的安裝目錄的标準庫中開始查找," "這種方式,會在目前的工程所在的檔案夾開始尋找,也就是源程式所在的檔案夾。有的編譯器,要求十分嚴格,不能混用,有的就可以。

bool的使用(完全可以當做整型用)

bool類型的本質:

bool類型的變量隻有兩種取值:yes、no

bool的輸出(當做整數來用);

c裡沒有布爾類型,c++,java裡有,oc也有。不過oc的布爾和c++有差別,在c++裡一切非 0 值的東西都為 true,而為0值的為false。但是object-c裡必須是1為 true ,且并被宏定義為 yes,0 為 false 并被宏定義為 no。

是以下面的代碼,則肯定是得不到想要的運作順序。

objective-c 文法快速過(1)
objective-c 文法快速過(1)
objective-c 文法快速過(1)
objective-c 文法快速過(1)

4不是1,在oc裡永遠都不會等于yes(因為 oc 中的yes就是1),注意:bool大寫,yes 和 no 也是大寫,oc 裡的yes就是1,no就是0

多個.m檔案的開發和混合開發

跟c語言中多檔案的開發是一樣的,回憶c多檔案開發,常量的定義或者函數的聲明寫在xxx.h檔案,函數的定義寫在xxx.c檔案,主檔案main.c裡寫主程式和函數調用,最後#include xxx.h檔案,一起編譯主檔案main.c和xxx.c檔案即可。

面向對象常用術語

面向過程 procedure oriented

面向對象 object oriented,簡稱oo

面向對象程式設計 object oriented programming,簡稱oop

1)       類相當于圖紙,用來描述一類事物。

2)       利用類來建立對象,對象是類的具體存在

3)       是以,面向對象解決問題應該是先考慮需要設計哪些類,再利用類建立多少個對象 

定義oc的類和建立oc的對象

定義一個新類分為 2 部分:

@interface 部分;

描述類、類的資料成分以及類的方法

@implementation 部分;

實作這些方法的實際代碼

@interface 部分的一般格式:

objective-c 文法快速過(1)
objective-c 文法快速過(1)

@implementation 部分的一般格式:

要描述類分2大步驟:類的聲明、類的實作(定義)。

跟函數類似,函數也分聲明和定義。而聲明一個類又需要三大要素:類名,屬性,行為,類似 c++。

命名規則:

以字母或下劃線開頭,之後可以是任何字母,下劃線或者0~9 數字組合。

約定:

類名以大寫字母開頭,命名有意義、比如駝峰辨別。

執行個體變量、對象以及方法的名稱以小寫字母開始。每次建立新對象時,将同時建立一組新的執行個體變量且唯一。

注意:在對象類型的右邊都有一個 *号,所有的對象變量都是指針類型。

id (萬能指針)類型已經被預定義為指針類型,是以不需要加一個*号。 

類的聲明,關鍵字@interface後一個空格,跟一個類名,然後最後必須寫@end,告訴編譯器類聲明完畢

類的聲明用來聲明對象的屬性(成員變量,也叫執行個體變量)和行為(方法)

: nsobject 繼承一個類(在foundation架構裡)

花括号裡用來寫對象屬性,不能寫方法

方法(行為);寫在花括号外,@end 前

方法開頭的(-)号或者(+)号表示:

(-) 該方法是執行個體方法(對類的特定執行個體執行一些操作) ;

(+)是類方法(即對類本身執行某些操作的方法,例如建立類的新執行個體) 

oc 一般的方法的聲明示例:

第一個表示方法類型(對象方法-),傳回類型(空void),接着是方法名(包括冒号:),方法接受的參數類型int和參數名n

如果沒有指定任何傳回類型, 那麼預設是id類型, 所有的輸入參數預設也是id類型 (id類型可用來引用任何類型的對象,屬于萬能指針類型) 。

 oc 裡具有多個參數的方法聲明示例:

如果隻有一個參數,在: 後面聲明參數的類型和名稱

如果有多個參數的話,每個參數前面都要有一 個 :,接着是參數類型和參數名稱。

在 objective c 中,對于有多個參數的函數,可以了解為将函數的名稱拆 成了幾個部分,每個部分都是對緊接着的參數的一個解釋 ,非常友善,做到見名知意,oc 官方文檔也是,尤其帶多個參數的方法名字往往特别的長。

如在 c++中多個參數的方法聲明:

但并不知道這些參數都是什麼意思,但在objective-c 中,可以這樣聲明:

利用類建立對象

oc裡,想執行一些行為,必須寫上一個中括号[],方括号左面是類的名稱或者該類執行個體的名稱,空格後面是方法(即消息) 

記憶體分析(對象在記憶體中有成員)

[car new]每次都會建立出新的對象,并且傳回對象的位址,那麼就應該用一個指針變量儲存對象的位址

設定車子對象的屬性,跟用指向結構體的指針通路結構體屬性一樣,用->

c->wheels = 3;

c->speed = 300;

對象在記憶體裡的變化和狀态圖

objective-c 文法快速過(1)

oc 類成員的通路屬性:

oc類屬性,預設是@protected,本類内部和繼承的類能通路,而外部無法通路,需要手動設定為public。

有一個典型的錯誤

oc千萬不能想當然的和c++,java混淆,不用在類實作裡再添加花括号了,直接寫方法的實作即可。

objective-c 文法快速過(1)

 和c++的不同,oc的類占據一份記憶體空間!

在第一次使用類的時候,類被加載到記憶體裡,即在建立對象之前,先給類配置設定記憶體空間。

objective-c 文法快速過(1)

1、存放類的記憶體隻被加載一次(第一次使用對象的時候,加載對象屬于的類)即可,且裡面隻存放方法的清單。

2、記憶體裡每個類的對象的存儲空間内部,預設都有一個指針叫isa指針,每個對象都有,作用是:指向這個對象所對應的類(存放類的記憶體塊,幫助找到對象所屬的類),是以所有的對象都共用一份方法,是以類隻被加載一次即可。成員變量每個對象都有自己的那一份記憶體,但是方法就共用一份記憶體

3、調用方法的過程:

執行:

給指針person1指向的對象發送一條walk消息,去調用那個對象的walk方法,然後對象會順着isa指針找到對應的類,去類裡找方法,找到walk方法,就前往對應的代碼去執行,就在walk方法裡通路目前對象的成員變量age和weight(因為成員變量,每個對象都有自己的一份)

再次強調:将對象賦給id類型變量不會有問題。

注:無論在哪裡,對象總是攜帶它的isa的保護成員(一個指針,可以用來确定對象所屬的類) ,是以即使将它存儲在id類型的通用對象變量中,也總是可以确定它的類 。

更加接近人類的思考方式

隻需要關注對象,不需要關注步驟 

但是注意:oc的對象不會自動去回收,一旦建立,一直存在記憶體裡,除非手動釋放,或者程式執行完畢。是以,函數建立的對象不會消失。但是沒有指向它的指針存在了。

注意,oc 裡,方法和函數是有本質的差別的,不要混淆!

辛苦的勞動,轉載請注明出處,謝謝……

http://www.cnblogs.com/kubixuesheng/p/4306395.html