Objective-C 基礎一:物件導向過程基礎知識
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開發上的問題不懂或者需要視訊教程可以看我的個人簡介。
不定時更新中。
相關文章
- Objective-C 基礎教程第三章,物件導向程式設計基礎知識Object物件程式設計
- JAVA(一)JAVA基礎/物件導向基礎/高階物件導向Java物件
- 【Java基礎知識】物件導向有哪些特性Java物件
- Java基礎-物件導向基礎Java物件
- 物件導向基礎物件
- Java常見知識點彙總(③)——物件導向基礎Java物件
- Java 物件導向基礎 以及進階知識 總結Java物件
- JAVA物件導向基礎Java物件
- PHP物件導向基礎PHP物件
- 【Java 基礎】——物件導向Java物件
- Java基礎 --- 物件導向Java物件
- JAVA物件導向基礎--物件導向介紹Java物件
- Java 基礎(一)重新理解物件導向Java物件
- PHP 物件導向基礎概念PHP物件
- java基礎二:物件導向Java物件
- python物件導向[基礎]Python物件
- 12 物件導向基礎-1物件
- Golang 基礎之物件導向Golang物件
- PHP物件基礎知識PHP物件
- 物件導向(理解物件)——JavaScript基礎總結(一)物件JavaScript
- 「MoreThanJava」Day 4:物件導向基礎Java物件
- 【Java基礎】物件導向開發Java物件
- 面向Python,物件導向(基礎)Python物件
- (Java筆記)物件導向基礎Java筆記物件
- PHP基礎之物件導向篇PHP物件
- Python基礎之物件導向Python物件
- 【Java基礎】--再談物件導向Java物件
- php基礎語法_物件導向PHP物件
- JAVA物件導向基礎--異常Java物件
- 協程庫基礎知識
- [.net 物件導向程式設計基礎] (19) LINQ基礎物件程式設計
- 面向Python,物件導向(基礎3)Python物件
- 面向Python,物件導向(基礎2)Python物件
- java基礎 - 物件導向三大特性Java物件
- 《Python 基礎篇》六:物件導向Python物件
- Java基礎 --- 物件導向綜合訓練Java物件
- PHP基礎之物件導向講解PHP物件
- [.net 物件導向程式設計基礎] (8) 基礎中的基礎——修飾符物件程式設計