Objective-C 基礎一:物件導向過程基礎知識

weixin_34148456發表於2017-04-12

1 . #import:Objective-C本質上就是C語言。和C語言一樣,Objective-C使用標頭檔案來包含元素宣告,這些元素包括結構體、符號常量、函式原型等。#import可保證標頭檔案只 被包含一次,而不論此命令實際上在那個檔案中出現了多少次。

在C語言中,程式設計師通常使用#ifdef命令來避免一個檔案包含另一個檔案,而後者又包含第一個檔案的情況。在OC中,使用#import來實現這個功能。

2 . NSLog():這個函式的作用和C語言的printf()很相似。NSLog()接受一個字串作為第一個引數,該字串可包含格式說明符(如%d)。此函式還可以接受匹配格式說明符的其他引數。這裡的“NS”是cocoa對其所有函式、常量和型別名稱都新增了“NS”字首。兩個不同事物使用相同識別符號時會導致名稱衝突,而字首可以預防這個大問題。

3 . 間接:基本變數就是間接的一種實際應用。檔案也是間接的一種示例。

4 . Objective-C不支援多繼承。例如:@interface Circle:NSObject, PrintableObject    編譯器將不能識別。

5 . 超類:是你所繼承的類。

父類:是超類的另一種表達方式。

子類:是實施繼承的類。

孩子類:是子類的另一種表達方式。

6 . 多型性:使用更具體種類的物件(Rectangle或Circle)代替一般型別(Shape),這種能力稱為多型性。

7 . super關鍵字:Objective-C提供某種方式來重寫方法,並且仍然呼叫超類的實現方式。當需要超類實現自身的功能,同時在前面或者後面執行某些額外的工作時,這種機制非常有用。為了呼叫繼承方法的實現,需要使用super作為方法呼叫的目標。向super傳送訊息時,實際上是在請求Objective-C向該類的超類傳送訊息。

8 . 如果用.mm做副檔名,編譯器就會認為你是用Objective-C++編寫程式碼,這樣你就可以同時使用C++語言和Objective-C來程式設計了。

9 . 我們在程式裡使用的都是#import,因為這些程式都只用到了Cocoa的這一部分功能,但是將它替換成#import也是可以的。這條語句既匯入了Foundation框架的標頭檔案,也匯入了其他一些檔案。

10 . 匯入標頭檔案有兩種方法:使用引號或者尖括號。例如#import“Button.h”或#import,帶尖括號的語句是用來匯入系統標頭檔案的,而帶引號的語句則是說明匯入的是專案本地的標頭檔案。如果你看到的標頭檔案名是用尖括號括起來的,那麼這個標頭檔案對你的專案來說是隻讀的,因為它屬於系統。如果標頭檔案名是被引號括起來的,那麼你就可以編輯它。

11 . @class:對於迴圈依賴關係很有用。即A類使用B類,B類也使用A類,如果用#import語句讓這兩個類相互引用,就會出現編譯錯誤。但是如果在A .h中使用@class B,在B.h中使用@class A,這兩個類就可以相互引用了。

12 . Xcode使用技巧:

快捷鍵:1.command+[ 和command+] 可以把選定的程式碼左移或者右移。

2.command+control+s或者File-》Make Snapshot開啟快照視窗,如果你修改錯了想要恢復到原來,你就可以開啟快照進行恢復了。

13 . NSRange 是一個結構體,它的定義為

typedef struct _NSRange{

int location;

int length;

}NSRange;

同樣的結構體還有NSPoint、NSSize、NSRect

14 . 如果你在宣告方法時新增了加號,那麼就是把這個方法定義為類方法。這個方法屬於類物件(而不是類的例項物件)並且通常用於建立新的例項。例如

+(id)stringWithFormat:(NSString *)format,...;方法就是一個類方法。

如果用減號來宣告一個方法,那麼這就是例項方法。我們所建立的大部分的方法都是例項方法。這些方法將會在某個物件例項中執行,比如獲取一個Circle的顏色。

如果某方法用來實現常規功能,比如建立一個例項物件或者訪問一些全域性類資料,那麼最好使用前導加號(+)將他宣告為類方法。

15 . 比較兩個字串可以用-(NSComparisonResult)compare:(NSString *)string; // 該方法返回一個  NSComparisonResult(就是一個enum型資料)來顯示比較結果。

typedef enum _NSComparisonResult {

NSOrderedAscending = -1,

NSOrderedSame,

NSOrderedDescending

} NSComparisonResult;

16 . 如果檢查兩個物件thing1和thing2是不是同一個物件,就使用運算子“==”。

如果檢查等價性(即兩個字串是否代表同一事物),就使用方法isEqualToString:。

17 .  compare:方法進行的是區分大小寫的比較。

-(NSComparisonResult) compare:(NSString *) string  options:(uisinged) mask;

方法的引數options是一個位掩碼。你可以使用位或運算子(|)來新增選項標記。一些常用的選項如下: NSCaseInsensitiveSearch:不區分大小寫字元

NSLiteralSearch:進行完全比較,區分大小寫。

NSNumericSearch:比較字串的個數,而不是字元值。

18.NSArray:只能儲存Objective-C的物件,不能儲存基本資料型別,如int、float、enum、struct,或者NSArray中的隨機指標。也不能在NSArray中儲存nil,因為在列表結尾新增nil代表列表結束。

19.使用列舉NSEnumerator來遍歷陣列

NSEnumerator *enumerator;

enumerator = [array objectEnumerator];

id thing;

while (thing = [enumerator nextObject]) {

NSLog("I found %@", thing);

}

20.NSArray和NSDictionary只能儲存物件,而不能直接儲存任何基本型別的資料,如int、float、struct。你可以用物件NSNumber來封裝基本數值。

例如,將int型資料封裝到一個物件中,然後就可以將這個物件放入NSArray和NSDictionary中。

NSNumber *number = [NSNumber numberWithInt:42];

[array addObject:number];

21.將一個結構體放入NSArray中。

NSRect *rect = NSMakeRect(1, 2, 30, 40);

NSValue *value = [NSValue valueWithBytes:&rect  objCType:@encode(NSRect)];

[array addObject:value];

可以使用方法getValue:來提取數值:(呼叫getValue:時,要傳遞的是要儲存這個數值的變數的地址)

value = [array objectAtIndex:0];

[value getValue:&rect];

還有一種便捷的方法:

value = [NSValue valueWithRect:rectt];

[array addObject:value];

22.代表主目錄的速記符號:~   用法如下:

NSString *home = [@"~" stringByExpandingTildeInPath];

//  stringByExpandingTildeInPath方法將“~” 替換成當前使用者的主目錄

23.記憶體管理規則:

1.當你使用new、alloc、copy方法建立一個物件時,該物件的保留計數器值為1。當不再使用該物件時,你要負責向該物件傳送一條release或autorelease訊息。這樣,該物件將在其使用壽命結束時被銷燬。

2.當你通過任何其他方法獲得一個物件時,則假設該物件的保留計數器值為1,而且已經被設定為自動釋放,你不需要執行任何操作來確保該物件被清理。如果你打算在一段時間內擁有該物件,則需要保留它並確保在操作完成時釋放它。

3.如果你保留了某個物件,你需要(最終)釋放或自動釋放該物件。必須保持retain方法和release方法的使用次數相等。

24 . 點表示式:如果點表示式出現在等號左邊,該屬性名稱的setter方法將被呼叫。如果 出現在右邊,則getter方法將被呼叫。例如:str.length = 10;     int length = str.length;

25 . 如果想要特性的名稱和支援特性的例項變數的名稱不相同,只需要在.h檔案中修改例項變數的名稱,並在.m檔案中寫上@synthesize 特性名稱 = 修改後的例項變數名稱。

例如 在Car.h檔案中

NSString *application // 定義一個例項變數

@property(nonatomic, copy) NSString *name; // 定義一個特性

如果你希望application是支援特性 name 的例項變數的名稱,則在Car.m檔案裡

@synthesize name = application 即可。

這樣,我們在訪問例項變數的時候用這種方法:self.name = @"Car";

26 . 當設定一個特性為只讀特性時,編譯器將只為該屬性生成一個getter方法,而不會生成setter方法。

27 . 為現有的類新增新方法,這些方法叫做類別(category)。類別的宣告和類的宣告方式一樣。

28 . 類別的侷限性:

1 . 類別不能新增新的實現變數,所以類別的宣告中沒有例項變數部分。

2 . 名稱衝突,即類別中的方法與現有的方法重名。當發生名稱衝突時,類別具有更高的優先順序。你的類別方法將完全取代初始方法,從而無法再使用初始方法。

29 . 不但可以將一個類的實現分散到多個不同的原始檔中,還可以將其分散到多個不同的框架中。

30 . 複製分為深層複製和淺層複製:

淺層複製(Shallow copy):不復制引用物件,新複製的物件只指向現有的引用物件。NSArray類的copy方法是淺層複製。如果複製一個NSArray類的物件,該物件包含5個NSString類的物件,則你最終得到的是5個可供程式使用的字串物件,而不是10個字串物件。

深層複製:將複製所有的引用物件。如果NSArray的copy方法是深層複製,則在複製操作完成以後你將得到10個可用的字串物件。

下圖為今年部分iOS開發的視訊教程,因為不定時更新中故不做多的截圖,如果有iOS開發上的問題不懂或者需要視訊教程可以看我的個人簡介。

不定時更新中。

5458052-8155a32731d0ba50.png

相關文章