1. 程式人生 > >IOS開發開篇之Objective-C語法基礎

IOS開發開篇之Objective-C語法基礎

     首先宣告:本系列技術部落格只作學習之用,不存在其它目的。

     作者從在吸收眾多網友經驗基礎上,結合自己在IOS開發的經驗將對IOS開發技術進行總結,以供後來者學習,更希望藉此使自己對IOS開發的深入理解。

      一、Objective-C與C的淵源

      Objective-C誕生於 20 世紀 80 年代,由Brad Cox 發明,意在將流行的、可移植的 C 語言與優雅的 Smalltalk 語言結合在一起。Objective-C C 語言的一個擴充套件集,它以 C 語言為基礎,在語言中添加了一些微妙但意義重大的特性。

      蘋果公司的iphone平臺採用Objective-C做為native language的開發,Objective-C的核心是C語言的,並基於C語言實現OOP的一些特性。Objective-C是對C語言的擴充套件,這和C++的前身Better-c有很大的相似之處,Objective-C的新版本里實現了和Java類似的垃圾回收機制,但基於iphone平臺的資源限制,iphone平臺並不支援垃圾回收機制。

二、初識Objective-C

      1Cocoa

      蘋果公司將CocoaCarbonQuickTimeOpenGL等技框架集提供Cocoa成部分有:(1)Foundation框架(有很多有用的,面向資料的低級類和資料結構);(2)Application Kit(也稱AppKit)框架(包含了所有的用介面象和高級類,例如NS……)有一個支援框架的套件,包括Core AnimationCore Image

     2NSLog相當於printf()

NSLog(@"hello Objective-C");

//注:@Objective-C

C言基上新增的特徵之一,雙引號的字串前面有一個@表示引用的字串應該CocoaNSString元素

    NSLog(@"are %d and %d different? %@",5,5,boolString(areTheyDifferent));

//注意%@:使用NSLog出任何值時,都會使用個格式

3BOOL使用8位存YES義為1NO義為0,大於1YES,跟C不同。

若不小心將一個1的整型值賦給BOOL只擷取低八位

Obejective-C1不等於1絕對不要將BOOLYES

三、怪異的Objective-C語法結構

   我這裡之所以說它的怪異,是相對於習慣其它程式語言(JAVA,C++等語言),下面把它最常見的特色簡單說明:

   1、減號(或者加號)

   我們每天都會在IOS開發中見到在方法名前“+”或“─”號,那麼這些是什麼,怎麼這麼奇怪?

首先要把以前學習面嚮物件語言的慣性思維拋去,在Objective-C裡面沒有publicprivate的概念,你可以認為全是public;它只有類方法和例項方法,加號表示類方法,類方法可以直接呼叫,而不用建立這個類的例項;減號表示例項方法,需要建立這個類的例項物件才可以呼叫。

比如c#/java中,一個方法的寫法可能是:

private void hello(bool ishello)

{

//OOXX

}

用Objective-C寫出來就是

-(void) hello:(BOOL)ishello

{

//OOXX

}

    有過程式設計經驗的人,理解這些應該不難!

    2、中括號

    中括號可以認為是如何呼叫你剛才寫的這個方法,通常在Objective-C裡說“訊息”。

 比如C#裡你可以這麼寫:

 this.hello(true);

在Objective-C裡,就要寫成: 

[self hello:YES];

   3、NS****

   在IOS開發中,經常會遇到NS開頭的物件,這個要從喬幫主歷史恩怨說起。當年Steve Jobs John Scullery與恩怨,喬幫主當年被人擠兌出蘋果,自立門戶的時候做了個公司叫做NextStep,裡面這一整套開發包很是讓一些科學家們喜歡,而現在Mac OS用的就是NextStep這一套函式庫。

   這些開發NextStep的人們比較自戀地把函式庫裡面所有的類都用NextStep的縮寫打頭命名,也就是NS****了。比較常見的比如:

NSLog

NSString

NSInteger

NSURL

NSImage

   你會經常看到一些教學裡面會用到:

NSLog (@"%d",myInt);

   這句話主要是在console裡面跟蹤使用,你會在console裡面看到myInt的值(在XCode裡面執行的時候開啟dbg視窗即可看到)。

你還可以看到其他名字打頭的一些類,比如CF、CA、CG、UI等等,比如

CFStringTokenizer 這是個分詞的東東

CALayer 這表示Core Animation的層

CGPoint 這表示一個點

UIImage 這表示iPhone裡面的圖片

CF說的是Core Foundation,CA說的是Core Animation,CG說的是Core Graphics,UI說的是iPhone的User Interface……還有很多別的,等你自己去發掘了。

四、Objective-C常見語法說明

   1 標頭檔案引用使用 #import “檔名或者 #import <檔名>的形式以確保每個標頭檔案僅被包含一次;

   2 類宣告@interface 類名:繼承類 開頭,以 @end 結尾,類實現以@implementation 類名 開頭,以 @end 結尾;

   3 例項方法,即成員方法,在方法名前面新增一個減號(-);類方法,在方法名前面新增一個加號(+);

   4 類方法的呼叫格式為 [類名 類方法],成員方法呼叫格式為 [例項名 例項方 法],這種模式在ObjC中被稱為訊息機制,[物件 訊息]即給物件傳送了一個訊息,產生的 效果就是該物件呼叫了該類中定義的對應的例項方法;

   5 下面以一個簡單的例子來說明上述語法:

Print類.h檔案(宣告檔案)

#import <Foundation/Foundation.h>

@interface Print : NSObject { //Objective-c的所有類都繼承於NSObject

// 成員屬性

    NSString *caption;

    NSString *photographer;

}

//在Objective-C 2.0引入了屬性合成,相當於之前的get/set方法

@property (nonatomic, copy) NSString *caption;

@property (nonatomic, copy) NSString *photographer;

// 類方法

+ (NSString*)printName;

@end

Print類.m檔案(實現檔案)

#import "Print.h"

@implementation Print

@synthesize photographer;

@synthesize caption;

// 類方法

+ (NSString*)printName

{

return (@"Print Result");

}

@end

Print 類使用

#import "Print.h"

int main(int argc, const char *argv[])

{

    NSAutoreleasePool * pool = [[NSAutoreleasePoolallocinit];

    return NSApplicationMain(argc, (const char **)argv);

// 類方法呼叫

    NSLog(@"ClassName = /"%@/"", [Print printName]);

// 初始化

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

// 設定器呼叫

    [p setCaption:@"MyCaption"];

    [p setPhotographer:@"MyPhotographer"];

// 獲取器呼叫

    NSLog(@"Caption = /"%@/"", [p caption]);

    NSLog(@"Photographer = /"%@/"", [p photographer]);

    [pool drain];

    return 0;

}

執行這段程式碼,結果如下:

2011-05-31 11:12:13.715 demo[1471:903] ClassName = "Print Result"

2011-05-31 11:12:13.718 demo[1471:903] Caption = "MyCaption"

2011-05-31 11:12:13.718 demo[1471:903] Photographer = "MyPhotographer"

   今天先寫到這裡,第一次寫部落格,下篇將對Objective-C記憶體管理進行探討。