oc013---oc程序的整體語法結構

程序的頭文件和源文件的擴展名分別爲.h 和.m。 註釋語法和C 一樣。Object_C 中的 nil 相當於 NULL。 Object_C 中的 YES 和 NO 相當於 true 和 false。
這裏再講解一下 YES 和 NO:
Object-c 提供了 BOOL 類型, 但這個BOOL 類型和 C++裏的並不一樣: 在C++裏一切非 0 值的東西都 爲 true,而爲 0 值的爲 false。但是 Object-c 裏 1 爲 true 並被宏定義爲 YES,0 爲 false 並被宏定義爲 NO。 所以,如果讀者寫下面的代碼,則肯定是錯誤的:

BOOL areIntsDifferent_faulty(intthing1,int thing2) {
return (thing1-thing2); }
if(areIntsDifferent_faulty(23,5)== YES)
{
}

因爲 areIntsDifferent_faulty 方法返回的是兩個整數的差,如果這個差不爲 1,那麼永遠不會爲 YES。
先了解程序的結構:

#import <Foundation/Foundation.h> 

int main(int argc,const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init ]; NSLog(@"Programming is fun!");
[pool drain];
return 0; }


#import <Foundation/Foundation.h>

相當於#include 導入頭文件 也有兩種查找方式< … > 和” … “。導入該頭文件是因爲在程序結尾處用 到的其他類和函數的有關信息


NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init ];

這條語句爲自動釋放池在內存中保留了空間,就是在釋放內存池的時候同時釋放調其中的所有對象, 若對象要加入該池,只要發送一條 autorelease 消息。

NSLog(@"Programming is fun!");
NSLog(@"The sum of 50 and 25 is %i",sum);
[pool drain]; //釋放內存池
[classOrInstance method]; 

左方括號是類的名稱或者該類實例的名稱,空格後面是方法(即消息)
獲得對象:(從 Car 類獲得其對象) youCar = [Car new];
定義一個新類分爲 2 部分: @interface 部分
描述類、類的數據成分以及類的方法 @implementation 部分
實現這些方法的實際代碼
@interface 部分的一般格式:

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

命名規則:以字母或下劃線開頭,之後可以是任何字母,下劃線或者0~9 數字組合, 約定:類名以大寫字母開頭,實例變量、對象以及方法的名稱以小寫字母開始。 每次創建新對象時,將同時創建一組新的實例變量且唯一。注意:在對象類型的右邊都有一個 *號,
所有的對象變量都是指針類型。Id 類型已經被預定義爲指針類型,所以不需要加一個*號。
函數開頭的(-)號或者(+)號表示:
(-) 該方法是實例方法(對類的特定實例執行一些操作) ; 或者稱爲對象方法

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

函數的聲明示例:
-(void)setNumerator :(int)n
第一個表示方法類型,返回類型,接着是方法名,方法接受的參數,參數類型,參數名
注:如果不帶參數則不用使用“:”號
如果沒有指定任何返回類型, 那麼默認是id類型, 所有的輸入參數默認也是id類型 (id類型可用來引用
任何類型的對象) 。
或許到現在你會認爲將對象賦給id類型變量會有問題。 注:無論在哪裏,對象總是攜帶它的isa的保護成員(可以用來確定對象所屬的類) ,所以 即使將它存儲在id類型的通用對象變量中,也總是可以確定它的類。
具有多個參數的方法:

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

如果只有一個參數,在: 後面聲明參數的類型和名稱;如果有多個參數的話,每個參數前面都要有一 個 : , 然後接着是參數類型和參數名稱。可是大家可能還是覺得很奇怪。比如上面這個例子中, otherParameter 這個是什麼意思,在 objective c 中,對於有多個參數的函數,可以理解爲將函數的名稱拆 成了幾個部分,每個部分都是對緊接着的參數的一個解釋。
如在 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;

@implementation 部分的一般格式:

@implementation NewClassName

methodDefinitions;

 @end

//NewClassName 表示的名稱與@interface 部分的類名相同。
一個簡單的示例:
//***********************************************************
//Fraction.h 文件

#import <Foundation/Foundation.h>
@interface Fraction : NSObject
{
int numerator; int denominator;
}
-(void)print;
- (void) setNumberator : (int) n;
- (void) setDenominator : (int) d; @end
//Fraction.m 實現文件 @implementation Fraction -(void)print
{
NSLog(@"%i/%i",numerator,denominator); }
- (void) setNumberator : (int) n {
numerator = n; }
- (void) setDenominator : (int) d {
denominator = d; }
@end 

//***********************************************************

Fraction * myFraction = [[Fraction alloc] init] ;

獲得對象的實例並且初始化了其實例變量 (可以這樣理解: 將alloc 消息發送給 Fraction 類請求創建一 個新實例,然後向新創建的實例對象發送init 消息來初始化該對象) 。
另外一種方法:
Fraction * myFraction = [Fraction new];但是通常使用第一種方式
對象調用方法 [myFraction setNumerator :1];
用完釋放 Fraction 對象的方法: [myFraction release]; 注:創建一個新對象,都要請求分配內存,在完成對該對象的操作時,必須釋放其所用的內存空間
i Phone 平臺不支持垃圾回收機制 外部要訪問實例變量需要通過類的方法來檢索其值,不能直接訪問
示例:
//*********************************************************************** //Rectangle.h 文件

@interface Rectangle : NSObject
{
int int
} @property
width ; heigth ;
int width ,heigth;
- (int)area ;
- (int)perimeter ;
- (void)setWidth :(int)w andHeigth :(int)h ; @end
//Rectangle.m 文件
#import "Rectangle.h" @implementation Rectangle @synthesize width , heigth ;
- (void)setWidth :(int)w andHeigth :(int)h {
width = w ;
heigth = h ; }
- (int)area {
return width *heigth ; }
- (int)perimeter {
return (width +heigth)*2 ;
} @end

下面是 Rectangle 的子類 Square //Square.h 文件

# import "Rectangle.h"
@interface Square : Rectangle - (void)setSide :(int)s ;
- (int)side ; @end ;
//Square.m 文件
# import "Square.h" @implementationSquare :Rectangle - (void)setSide :(int)s
{
[self setWidth : s
}
- (int)side {
return width ; }
andHeight : s]
@end ; 

//************************************************************

self 關鍵字用來指明對象是當前方法的接收者。
例如下面是一個子類(正方形)的方法實現:

- (void) setSide: (int)s
{
[self setWidth : s andHeight : s] 
}

利用其父類(長方形)的 setWidth: andHeight:方法來實現的。 調用消息的類可以不知道如何響應這個消息。如果它不知道如何處理這個消息,它會自動的將這個消息轉 給的父類,還不行就轉給父類的父類,都沒有找到就會報錯。
與 C 語言兼容的地方: 預處理:

#define 語句和 c 一樣
//#運算符: #define str(x) #x 表示在調用該宏時,預處理程序根據宏參數創建C 風格的常量字符串。 例如:str("hello")將產生"\"hello"\"
//#運算符: 表示用於把兩個標記連在一起
#import 語句相當於#include 語句,但是 #import 可自動防止同一個文件被導入多次。 #條件編譯語句(#ifdef#endif#else#ifndef)和 C 一樣
#undef 語句 消除特定名稱的定義

其他基本的C 語言特性:

數組、函數、指針、結構、聯合的用法和C 一樣。
Compound Literal 是包含在括號之內的類型名稱,之後是一個初始化列表。 例如 如果 intPtr 爲 int * 類型:
intPtr = (int[100]){[0] = 1, [50] = 50, [99] = 99};
如果數組大小沒有說明,則有初始化列表確定。

其他如循環語句 (do while、while、for) 、條件語句(if 語句(if-else、複合判斷條件等) 、switch 語句)、 Boolean(YES NO)、條件運算符、goto 語句、空語句、逗號表達式、sizeof 運算符、命令行參數、位操作都 和 C 一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章