objective-c基礎教程

提綱:

簡介

與C語言相比要注意的地方

objective-c高級特性

開發工具介紹(cocoa 工具包的功能,框架,源文件組織;XCode使用介紹)

簡介:

1.       objective-c是C語言的一個擴展集,主要由APPLE公司維護,是MAC系統下的主要開發語言。

個人認爲,對於用慣了常用的C,JAVA等語言的人來說,objective-c是一中很另類,非主流的語言。

2.    開發 Mac的 UI 程序來說,使用的是 Cocoa 這個框架,cocoa的組成部分有:foundation和application kit框架。

【foundation框架處理用戶界面之下的特性,如數據結構和通信機制;application kit框架包含cocoa的高級特性:用戶界面元素,打印,顏色,聲音管理,applescript等】

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文件。

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