一.Objective-C 語法學習
相關概念
Xcode: 開發環境,像Visual Studio
Objective-C:計算機開發語言,像C++,C#,JAVA
後綴名 |
含義 |
.c |
C language source file |
.cc , .cpp |
C++ language source file |
.h |
Header file |
.m |
Objective-C file |
.mm |
Objective-C++ source file |
.pl |
Perl source file |
.o |
Object(compiled)file |
.xib ,nib |
視圖編輯文件 |
OOP術語:
繼承:(is a)
複合:(has a)
超類(superclass):是你所繼承的類。
父類(parentclass):是超類的另一種表達方式。
子類(subclass):是實施繼承的類。
孩子類(childclass):是子類的另一種表達方式。
重寫(override):改變方法的實現時,需要重寫繼承方法。
多態:使用更具體種類的對象代替一般類型的能力成爲多態性(polymorphism)
self:每個方法調用都獲得了一個名爲self的隱藏參數,它是一個指向接收消息的對象的指針。方法使用self參數查找它們要使用的實例變量。
super:向super發送消息時,實際上是在請求Objective-C向該類的超類發送消息。
前向引用 :@classdefault; //讓兩各類互相引用
存取方法(setter,getter)
protocol-協議,就是使用了這個協議後就要按照這個協議來辦事,協議要求實現的方法就一定要實現。
delegate-委託,顧名思義就是委託別人辦事,就是當一件事情發生後,自己不處理,讓別人來處理。(周少對他家女傭說,如果XX回來了,打個電話給我,[女傭在這裏就起委託作用])
nil: nil對象被設計來跟NULL空指針關聯的。他們的區別就是nil是一個對象,而NULL只是一個值。而且我們對於nil調用方法,不會產生crash或者拋出異常。
BOOL:有兩個值YES,NO ;
id :是一種泛型,用於表示任何種類的對象
#import:頭文件引用,可以保證頭文件只被包含一次
@interface:接口聲明 與 @end 配套使用
@property:聲明對象屬性(包含copy, retain, readwrite,readonly等屬性)
@end:接口聲明結束標誌
@implementation :方法實現
@synthesize:表示“創建該屬性的訪問器”
@selector()選擇器
[]:方括號內第一項是對象,其餘部分是你需要對象執行的操作(類似於方法調用)
%d:表示輸出整數
%@:表示輸出NSString類型
%s:表示輸出字符串數組(char*)
+:前置加號(+)的方法爲類方法,這類方法是可以直接用類名來調用 -:前置減號(-)的方法爲實例方法,必須使用類的實例纔可以調用
內存分配與釋放:alloc,new,copy,retain,init,release,autorelease,drain
[pool drain],drain方法只是清空釋放池,但不銷燬pool.
內存管理黃金準則:
只有通過alloc, new和 copy方法創建的對象,才需要程序員負責向該對象發送release或autorelease消息。
而通過其他方法獲得的對象,則默認爲已經被設置爲自動釋放,所以不需要程序員做任何操作了。
對象初始化:[類名 new] , [[類名 alloc] init] 這兩種方法等價
與C一致的地方:
數據類型,表達式,各種運算符
循環:for, while, do while, break,continue
分支:if, else, switch
二.圖例學習
最常用的數據類型:字符串NSString
Objective-C將字符串數據類型定義成爲Class,支持可變長度的字符串,支持Unicode等等一些實用的方法。通過使用@標誌符,可以方便的由字符串常量定義NSString對象。下面給出一些定義NSString的代碼實例。
NSString *string1 = @"const string";
NSString *string2 = [NSString stringWithFormat:@"%d %d %s", 1, 2,"hello string"];
類(Class)
作爲面嚮對象語言最基本也是最重要的數據類型,Objective-C當然不會不支持。Objective-C定義類的特點在於先在.h頭文件裏定義接口,然後在.m代碼文件裏實現。
關於.h頭文件的具體的語法看下面的圖更直接一點。
關於.m代碼文件的具體語法也請參考下面的圖。
大家注意一下initWithUserName()方法的返回值的數據類型爲id,是不是感覺這個一般的語言有點區別。其實,這種數據類型類似於C++的指針。在Objective-C裏面仍然叫做指針類型。Objective-C的對象的定義,可以支持強類型的實例,以及弱類型的實例的定義。簡單的說,強類型就是定義該實例的時候必須指明類的名字,弱類型就是沒有指明類的名字。下面給大家看看實際的代碼就會明白,定義這兩者的時候的區別。
MYHelloWorld*myHelloWorld1; // 強類型(Strong typing)
id myHelloWorld2; // 弱類型(Weak typing)
順別提一下,弱類型能給實現設計模式(Design Patterns)的時候帶來很大的方便。
方法(Methods)
方法Methods又可稱爲函數。在Objective-C裏的類可以定義兩種方法。一種是實例的方法,一種是類的方法。實例的方法侷限於某個類的實例,也就是必須定義這個類的實例之後,才能被調用執行的方法。類的方法不需要創建實例,直接通過類的名稱就可以被調用執行的方法。
定義一個方法需要:方法名(一個或者多個關鍵字),返回值類型,參數類型和參數名。下面這的圖詳細的說明了如何定義一個實例的方法,其中負號[-]表示該方法爲實例的方法,該方法的名稱加上各個關鍵字包括冒號即爲[insertValue:atIndex:]。
Objective-C調用方法是通過發送消息給對應的實例對象。發送消息的方式其實是和一般的編程語言一樣就是調用實例對象的方法,Objective-C獨特的地方就是方法的調用是通過一個方法名+零個或多個標示符+零個或多個參數,然而一般的編程語言只需要一個方法名+零個或多個參數就可以了。Objective-C裏面之所以把調用方法稱爲發送消息,大概是因爲所有的消息發送之後都是動態傳遞給實例對象的。並且,如果一個子類定義了一個和父類相同方法名+標示符的方法之後,子類會先收到該消息,然後選擇性的是否繼續將該消息傳遞給父類。
發送消息是通過一對方括號[]來實現的。在括號的裏面,實例對象在左邊,消息以及參數等的定義在右邊。例如:
[anObject insertValue:anObjatIndex:1];
爲了避免生成多餘的臨時變量,Objecttive-C容許直接使用消息的結果。如下例:
[[anObject getArray] insertValue:[anObjectgetValueToInsert] atIndex:0];
類的方法,類似於靜態方法(Static Function),常用於作爲工廠模式中用來生成新的實例。定義的時候和實例的方法有區別的地方就是開頭的符號爲加號[+]。調用的類的方法和調用(Static Function)基本相同,直接通過類名就可以,如下例:
NSMutableArray* myArray= nil; //nil等同於通常的NULL
// 創建一個動態數組,並且制定最初的大小
myArray = [NSMutableArray arrayWithCapacity:19];
屬性
屬性是一個可以取代方法的方便符號。在類中聲明定義屬性時,並不創建新的實例,就是一個能夠方便快捷的用來訪問實際已經存在的變量的方法。也就是說,屬性其實並沒有真正的存儲任何數據。
其實屬性是可以讓你在編寫代碼時減少影響效率的冗餘代碼。簡單的說屬性要比getter和setter方法快。
屬性還可以定義一些訪問該屬性時的限制或者如何獲取該屬性,例如指定copy用來複制該屬性,readonly用來指定該屬性只讀。
@property BOOL workFlag;
@property (copy) NSString* oString; //通過複製來使用該屬性.
@property (readonly) UIView* oView; //定義一個類似於getter的屬性.
調用某實例的屬性有兩種方法,一種是通過括號,和調用方法類似,另外一種是通過點符號[.]。第二方法比較方便,也符合大多數開發人員的習慣。
//第一種調用方法
[myObjectsetFlag:YES];
CGRect viewFrame = [[myObjectrootView] frame];
//第二種調用方法
myObject.flag = YES;
CGRect viewFrame =myObject.rootView.frame;
協議和委託(Protocols and Delegates)
Objective-C中的協議(Protocol)類似於常用的接口,協議(Protocols)中定義的方法,在類中實現。
@protocol MyFirstProtocol
-(void)myFirstProtocolMethod;
@end
在iPhone OS中,協議(Protocol)通常用來實現委託對象(Delegate Object)。委託對象(Delegate Object)一般用來自己定義行爲或者動作,也就是調用自己定義方法,但自己不實現該方法,委託其它的類來實現該方法。
UIApplication類就是一個典型的例子。UIApplication類中定義了一個應用程序應有的行爲或者動作。而不是強制讓你的UIApplication子類去接受當前應用程序的狀態消息並做出相應處理。UIApplication類通過調用特殊的方法,來傳遞這些消息給它的委託對象。這個委託對象通過實現名爲UIApplicationDelegate的協議(Protocol),之後就可以接受到當前應用程序的狀態消息並做出相應處理。比如內存不夠的錯誤,應用程序被中斷等重要消息。
下面給出一段關於HelloWorld的實例代碼:
//main.m
#import
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal =UIApplicationMain(argc, argv, nil, nil);
[poolrelease];
returnretVal;
}
三.iphone框架學習
這是老版本的框架:
名 稱 |
初始版本 |
前 綴 |
描 述 |
AddressBook. framework |
2.0 |
AB |
包含直接訪問用戶 聯繫人數據庫的功能 |
AddressBookUI. framework |
2.0 |
AB |
包含顯示系統定義 聯繫人和編輯接口 |
AudioToolbox. ramework |
2.0 |
AU, Audio |
包含音頻流數據處 理和音頻播放與錄製接口 |
AudioUnit.framework |
2.0 |
AU, Audio |
包含裝載和使用音 頻單元的接口 |
CFNetwork.framework |
2.0 |
CF |
包含Wi-Fi和蜂窩基 站訪問網絡的接口 |
CoreAudio.framework |
2.0 |
Audio |
提供Core Audio數據類型 |
CoreFoundation. framework |
2.0 |
CF |
提供基礎軟件服務, 包括通用數據類型、 字符串應用、Collection Utilities、資源管理和 首選項的抽象 |
CoreLocation.framework |
2.0 |
CL |
包含用戶位置信息的接口 |
CoreGraphics.framework |
2.0 |
CG |
包含Quartz 2D的接口 |
Foundation.framework |
2.0 |
NS |
包含Cocoa基礎層的類和方法 |
IOKit.framework |
2.0 |
N/A |
包含設備接口 |
MediaPlayer.framework |
2.0 |
MP |
包含播放全屏視頻接口 |
OpenAL.framework |
2.0 |
AL |
包含跨平臺位置音頻庫 的OpenAL接口 |
OpenGLES.framework |
2.0 |
EAGL, GL |
包含OpenGL ES接口, 它是跨平臺的2D和 3D圖形庫的OpenGL 的嵌入式版本 |
QuartzCore.framework |
2.0 |
CA |
包含Core Animation接口 |
Security.framework |
2.0 |
CSSM, Sec |
包含管理證書,公鑰/ 私鑰對和信任策略的接口 |
System-Configuration. framework |
2.0 |
SC |
包含設備網絡配置的接口 |
UIKit.framework |
2.0 |
UI |
包含iPhone應用的用 戶界面的類和方法 |