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

來源:互聯網
上載者:User

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

有一定 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檔案(檔案名稱可以是中文),然後編譯器編譯,連結,運行。

 

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一樣,加入下面的預先處理指令了

#ifndef  xxx xxx#define xxx xxx#endif

Foundation架構的作用

開發iOS、Mac程式必備的架構,此架構中包含了很多常用的API。架構中包含了很多標頭檔,若想使用整個架構的內容,包含它的主標頭檔即可

#import <Foundation/Foundation.h>

相當於#include 匯入標頭檔 也有兩種尋找方式< ... > 和" ... "。

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

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

BOOL類型的本質:

typedef signed char BOOL;

BOOL類型的變數只有兩種取值:YES、NO

#define YES (BOOL)1#define NO  (BOOL)0

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

NSLog(@"%d %d", YES, NO);//1 0

C裡沒有布爾類型,c++,java裡有,oc也有。不過oc的布爾和c++有區別,在C++裡一切非 0 值的東西都為 true,而為0值的為false。但是Object-c裡必須是1為 true ,且並被宏定義為 YES,0 為 false 並被宏定義為 NO。

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

 1 #import <Foundation/Foundation.h> 2 BOOL isBool(int, int); 3  4 int main(void) 5 { 6     if (isBool(5, 1) == YES) { 7         NSLog(@"ok"); 8     } 9     return 0;10 }11 BOOL isBool(int x, int y)12 {13     return x - y;14 }

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
OC中的面相對象

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

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

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

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

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

@interface 部分;

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

@implementation 部分;

實現這些方法的實際代碼

 

@interface 部分的一般格式:

@interface NewClassName : ParentClassName{memberDeclarations;}methoddeclarations;@end 

@implementation 部分的一般格式:

@implementation NewClassNamemethodDefinitions;
@end//NewClassName 表示的名稱與@interface 部分的類名相同

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

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

命名規則:

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

約定:

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

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

注意:在物件類型的右邊都有一個 *號,所有的物件變數都是指標類型。

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

  • 類的聲明,關鍵字@interface後一個空格,跟一個類名,然後最後必須寫@end,告訴編譯器類聲明完畢
  • 類的聲明用來聲明對象的屬性(成員變數,也叫執行個體變數)和行為(方法)
  • : NSObject 繼承一個類(在Foundation架構裡)
  • 花括弧裡用來寫對象屬性,不能寫方法
  • 方法(行為);寫在花括弧外,@end 前
    三要素:方法名,參數,傳回值(類似函數,分聲明和實現),方法的聲明在類的聲明裡,且不能寫在花括弧裡。
    方法雖然類似c的函數,但是和函數千差萬別
    只要方法是對象的方法,則聲明前必須加一個減號-,這是規則!
    oc方法裡的任何資料類型都必須用小括弧()括起來
    oc方法的小括弧就一個作用,就是括住資料類型的。故- (void) run();是不對的!
  • 類的實現,類似於類的聲明文法,也要寫@end
  • 對象裡的成員變數,可以取值整型的,那麼預設初始化為0
  • oc方法的實現,必須寫在類的實現裡,說清楚方法裡有什麼。

方法開頭的(-)號或者(+)號表示:
(-) 該方法是執行個體方法(對類的特定執行個體執行一些操作) ;

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

oc 一般的方法的聲明樣本:

-(void)setNumerator :(int)n

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

注:如果不帶參數則不用使用“:”號

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

 oc 裡具有多個參數的方法聲明樣本:

-/+ (return type) function_name : (parameter type) parameter1 otherParameter : (parameter_type) parameter2;

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

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

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

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

void initializeRectangle(int x1, int y1, int x2, int y2); 

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

void initializeRectange: (int)x1 LeftUpY :(int)y1 RightBottomX: (int)x2 RightBottomY:(int)y2; 

利用類建立對象

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

[classOrInstance method];
執行Car這個類的new行為來建立對象,分配了記憶體,每個對象都有自己的儲存空間來儲存自己的成員變數等元素
youCar = [Car new];//建立了一個Car類的對象,返回對象的地址(返回對象)。之後記憶體裡存在這個對象了。
oc裡想操作對象,只能用指標去間接操作!
Car *p = [Car new];//把地址儲存到指標裡,p指向的是Car類型的對象
給p指向的對象的屬性賦值
 p->speed = 200;

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

[Car new]每次都會建立出新的對象,並且返回對象的地址,那麼就應該用一個指標變數儲存對象的地址

Car *c = [Car new];//用一個指標變數c指向記憶體中的Car對象     

設定車子物件的屬性,跟用指向結構體的指標訪問結構體屬性一樣,用->

c->wheels = 3;

c->speed = 300;

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

oc 類成員的訪問屬性:

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

@pubic

有一個典型的錯誤

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

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

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

1、存放類的記憶體只被載入一次(第一次使用對象的時候,載入對象屬於的類)即可,且裡面只存放方法的列表。

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

3、調用方法的過程:

[person1 walk]; 

執行:

給指標person1指向的對象發送一條walk訊息,去調用那個對象的walk方法,然後對象會順著isa指標找到對應的類,去類裡找方法,找到walk方法,就前往對應的代碼去執行,就在walk方法裡訪問當前對象的成員變數age和weight(因為成員變數,每個對象都有自己的一份

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

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

物件導向封裝的好處
  • 更加接近人類的思考方式
  • 只需要關注對象,不需要關注步驟 
  • 但是注意:oc的對象不會自動去回收,一旦建立,一直存在記憶體裡,除非手動釋放,或者程式執行完畢。所以,函數建立的對象不會消失。但是沒有指向它的指標存在了。
  • 注意,oc 裡,方法和函數是有本質的區別的,不要混淆!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.