作者從在吸收眾多網友經驗基礎上,結合自己在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
1、Cocoa的組成
蘋果公司將Cocoa、Carbon、QuickTime和OpenGL等技術作為框架組提供Cocoa組成部分有:(1)Foundation架構(有很多有用的,面向資料的低級類和資料結構);(2)Application Kit(也稱AppKit)架構(包含了所有的使用者介面對象和進階類,例如NS……),還有一個支援架構的套件,包括Core Animation和Core Image。
2、NSLog相當於printf()
NSLog(@"hello Objective-C");
//註:@是Objective-C在標準C語言基礎上添加的特徵之一,雙引號的字串前面有一個@,這表示引用的字串應該作為Cocoa的NSString元素處理
NSLog(@"are %d and %d different? %@",5,5,boolString(areTheyDifferent));
//注意%@:使用NSLog輸出任何對象值時,都會使用這個格式說明
3、BOOL使用8位儲存,YES定義為1,NO定義為0,大於1不為YES,跟標準C不同。
若不小心將一個長於1位元組的整型值賦給BOOL,則只截取低八位
Obejective-C中1不等於1,絕對不要將BOOL值和YES比較
三、怪異的Objective-C文法結構
我這裡之所以說它的怪異,是相對於習慣其它程式設計語言(JAVA,C++等語言),下面把它最常見的特色簡單說明:
1、減號(或者加號)
我們每天都會在IOS開發中見到在方法名前“+”或“─”號,那麼這些是什麼,怎麼這麼奇怪?
首先要把以前學習物件導向語言的慣性思維拋去,在Objective-C裡面沒有public和private的概念,你可以認為全是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 = [[NSAutoreleasePool alloc] init];
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記憶體管理進行探討。