提綱:html
簡介程序員
與C語言相比要注意的地方objective-c
objective-c高級特性編程
開發工具介紹(cocoa 工具包的功能,框架,源文件組織;XCode使用介紹)數組
簡介:xcode
1. objective-c是C語言的一個擴展集,主要由APPLE公司維護,是MAC系統下的主要開發語言。數據結構
我的認爲,對於用慣了經常使用的C,JAVA等語言的人來講,objective-c是一中很另類,非主流的語言。app
2. 開發 Mac的 UI 程序來講,使用的是 Cocoa 這個框架,cocoa的組成部分有:foundation和application kit框架。框架
【foundation框架處理用戶界面之下的特性,如數據結構和通訊機制;application kit框架包含cocoa的高級特性:用戶界面元素,打印,顏色,聲音管理,applescript等】iphone
3. 我經過這本書的學習:
基本掌握了Objective C的語法,基本能看懂別人寫的代碼,本身也能編寫代碼;
熟悉了開發環境XCode的使用;(包括創建項目,調試,運行,代碼管理等)
與C語言相比要注意的地方:
1. 文件介紹:Objective-C 也使用頭文件(header files),後綴爲 .h, 但使用 .m(即 message, 其餘面向對象編程語言也叫 method),做爲源文件的後綴。
在objective-c中使用#import<>,而不使用#include<>,#import能夠保證頭文件只被包含一次。
2. 與C一致的地方:
數據類型,表達式,各類運算符
循環:for, while, do while, break, continue
分支:if, else, switch
3. NSlog()函數:與printf()相似,想控制檯輸出信息。但它增長了一些特性,如時間戳等。
【cocoa對起全部的函數,常量和類型名稱都添加了NS前綴。】
4. 雙引號的前面的@表示這雙引號中的字符串應該做爲cocoa的NSString元素來處理。
5. 布爾類型BOOL:值爲YES,NO;
6. %d表示輸出整數
%@表示輸出NSString類型
%s表示輸出字符串數組(char*);
7. objective-c中的方括號:
1. 用於通知某個對象該作什麼。
2. 方括號內第一項是對象,其他部分是你須要對象執行的操做。
3. 在objective-c中通知對象執行某種操做,稱爲發送消息。(也叫調用方法)
8. 標識符id:是一種泛型,用於表示任何種類的對象。
9. 類聲明@interface:
@interface Circle:NSObject //爲Circle類定義接口;NSObject表示是父類。 {//如下是數據成員 ShapeColor fillColor; ShapeRect bounds; } //如下是方法聲明 -(void) setFillColor: (ShapeColor) fillColor; //前面的短線代表這是方法聲明 //短線後面是方法的返回類型 //接着是方法名 //冒號後面是參數,其中(ShapeColor)是參數類型, fillColor是參數名 -(void) setBounds:(ShapeRect) bounds; -(void) draw; //減號就是普通函數 加號就是靜態函數 @end //結束聲明 |
objective-c看到@符號,就把它當作是C語言的擴展。 |
一個類的完整聲明以下: @interface CClassA(Category): CBaseClass<IA,IB...> //類名(類別名):父類<協議> |
10. 類實現@implementation
@implementation |
@implementation Circle -(void) setFillColor: (ShapeColor) c { fillColor=c; } -(void) draw { NSLog(@」drawing a circle at(%d %d %d %d) in %@」, bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillName)); } @end |
隱藏對象self對應於C中的this。 Self->fillcolor來訪問成員變量。 |
11. 調用寫好的類和類函數:
//建立新對象,使用缺省初始化函數 Bank *bankDefault = [[Bank alloc] init]; //調用方法: [bank addAmount: 1]; [bank print]; // 釋放對象: [bankDefault free]; |
12.
兩個參數的方法: |
-(void) setTire: (Tire *) tire //聲明 atIndex: (int) index; //使用 [car setTire:tire atIndex:2]; |
objective-c高級特性:
1. 繼承
Objective-c不支持多繼承。 |
Super 關鍵字:調用該類的父類; 超類:父類的另外一種說法。 |
2.
自定義NSLog()輸出: |
在類中添加description方法就能夠自定義NSLog()如何輸出對象。 |
@implementation Tire -(NSString *) description { Return (@」I am a tire.」); } Main() { NSLog(@」%@」,tire[0]); } |
3.
Foundation kit: |
Cocoa是由兩部分框架組成的:foundation kit [包括一些基礎類]和 application kit.【包括用戶接口對象和高級類】 |
建立字符串: NSString *test; test=[NSString stringWithFormat:@"i'm %d years old!",23]; |
若在聲明方法時在方法前面添加了加號,那就表示把這個方法定義爲類方法【這個方法屬於類對象,而不是類的實例對象。】 |
NSArray類:能夠存聽任意類型的對象. 它有兩個限制: 1. 它只能存儲objective-c的對象,但不能存儲C中的基本數據類型,如int , float, enum, struct等。 2.不能存儲nil(對象的零值或NULL值);【由於在建立NSArray時,要在列表結尾添加nil表明列表結束。】 建立NSArray: NSArray *array; array=[NSArray arrayWithObjects:@"one",@"two",nil]; |
NSString, NSMutableString類; 【NSString是不可變的,即一旦建立完成,就不能經過刪除字符或添加字符的方式來改變它; 而NSMutableString是可變的。 這兩個類就像JAVA中的string與stringBuffer類的區別。】 NSArray, NSMutableArray類; NSEnumerator枚舉; 【 NSEnumerator *emun; Emun=[array objectEnumerator]; Id thingie; While(thingie=[enumerator nextObject]){} 】 NSDictionary:字典(關鍵字及其定義的集合。)【也成爲散列表,關聯數組】,NSMutableDictionary類; NSNumber:用來包裝基本數據類型,如int ,char, float, bool;【將一個基本類型的數據包裝成對象叫作裝箱。】 NSValue:它能夠包裝任何類,NSNumber是它的子類。 NSNull: |
在cocoa中看到「CF」字樣時,就表示它是蘋果公司的Core Foundation 框架相關的內容。 |
NSAutoreleasePool:自動釋放內存池。 |
4.
內存管理 |
每一個對象都有一個與之關聯的引用計數(也叫保留計數) |
當使用alloc, new 方法或經過 copy消息(生成接收對象的一個副本)建立一個對象時,對象的引用計數值被設爲1; 給對象發retain消息時,增長該值; 發送release消息時,減小該值; 當一個對象的引用計數值變爲0時,objective-c會自動向對象發送一條dealloc消息。銷燬該對象。 你能夠在本身的對象中重寫該方法, 使用retainCount消息,能夠獲取引用計數器的值。 -(id) retain; -(void) release; -(unsigned) retainCount; |
自動釋放池:autorelease pool; 建立: NSAutoreleasePool *pool; pool=[[NSAutoreleasePool alloc] init]; 銷燬: [pool release]; 注意:xcode自動生成的代碼,銷燬pool池時,使用的是[pool drain],drain方法只是清空釋放池,但不銷燬pool.因此在本身編寫代碼時仍是使用release. 並且,drain只適用於MAC OS 10.4以上的版本,而release適用於全部版本。 只有在向某個對象發送autorelease消息時,該對象纔會添加到NSAutoreleasepool中,纔會被自動釋放。 如:[car autorelease]; |
內存管理黃金準則: 只有經過alloc, new和 copy方法建立的對象,才須要程序員負責向該對象發送release或autorelease消息。 而經過其餘方法得到的對象,則默認爲已經被設置爲自動釋放,因此不須要程序員作任何操做了。 |
在objective-c 2.0中有垃圾回收機制, 若是要對某個項目使用垃圾回收: 項目信息--build選項卡--查詢"garb",出現「objective-c Garbage Collection」,將其值設置爲「required[-fobjc-gc-only]」 啓用垃圾回收後,一般的內存管理命令全都變成了空操做指令,不執行任何操做。 開發iphone軟件,不能使用垃圾回收。 |
5.
對象初始化 |
兩種建立新對象的方法: [類名 new] [[類名 alloc] init] 這兩種方法是等價的,但cocoa的慣例是使用後者。 |
alloc在爲對象分配空間的同時,將這塊內存初始化爲0; |
Init方法:初始化實例變量,使對象處於可用狀態。[返回類型爲id, 返回的值描述了被初始化的對象] 使用new建立新對象時,系統要完成兩個步驟: 1. 爲對象分配內存,即對象得到一個用來存放其實例變量的內存塊; 2. 自動調用init方法,讓該對象處於可用狀態。 |
6.
objective-c 2.0的新特性【只適用於mac os x10.5及以上】 |
@property :表示聲明瞭對象的屬性。【這樣就不用再寫屬性的訪問器了。】 (他有copy, retain, readwrite, readonly等屬性) |
@synthesize:表示「建立該屬性的訪問器」 |
點表達式 |
7.
類別 |
類別(category)是一種爲現有的類添加新方法的方式。 |
類別的聲明: @interface NSString (NumberConvenience) //類名 (類別名) -(NSNumber) lengthAsNumber; //擴充方法聲明 @end 使用時使用原來的類名,就能夠調用他的全部類別中的方法。 |
類別的侷限性: 1. 不能向類中添加新的實例變量; 2. 在類別中的方法若與類中現有的方法重名,則類中的方法不可用,被類別中的新方法取代。 |
類別的做用: 1. 將類的實現分散到多個文件或框架中; 2. 建立對私有方法的前向引用; 【Cocoa中沒有真正的私有方法,則實現私有方法相似功能的方法爲: 先在類別中聲明方法;而後到現有類的實現中實現該方法。 這樣這個類中的其餘方法可使用該方法,而其餘外部的類就不會知道該方法的存在了。】 3. 向對象添加非正式協議。 【建立一個NSObject的類別稱爲建立一個非正式協議。】 |
委託delegate是一種對象,另外一個類的對象會要求委託對象執行它的某些操做。 受委託對象在某個時間(某個事件觸發)時,會自動通知委託對象執行委託方法。 |
選擇器:@selector():選擇器只是一個方法名稱,但它以objective-c運行時使用的特殊方式編碼,以快速執行查詢。圓括號中的內容是方法名。 因此Car類的setEngine:方法的選擇器是:@selector(setEngine: 受委託對象如何知道其委託對象是否能處理它(受委託對象)發送給它(委託對象)的消息? 經過選擇器,受委託對象先檢查委託對象,詢問其是否能響應該選擇器。若是能,則向它發送消息。 |
8.
協議: |
正式協議是一個命名的方法列表。 採用協議意味着必須實現該協議的全部方法。不然,編譯器會發出警告。 正式協議就像JAVA中的接口同樣。 |
聲明協議: @protocal NSCopying -(id) copywithzone:(NSZone *) zone; //方法列表 @end |
採用協議: @interface Car:NSObject <NSCopying,NSCoding> //中括號中是要實現的協議列表 {//實例變量列表} //方法列表 @end |
在objective-c 2.0中,有新特性:@optional, @required |
9.
AppKit: |
建立APPKIT項目: File—new project—mac os—application—Cocoa application; |
IBOutlet與IBAction 這兩個都是APPKIT提供的#defines. IBOutlet沒有任何做用,不會對它進行編譯。 IBAction定義爲void。 這兩個是爲Interface Builder以及閱讀代碼的人提供的標記。 |
.xib文件通常稱爲.nib文件。 .nib文件是包含被凍結對象的二進制文件。 而.xib文件是XML格式的nib文件。 |