黑馬程式設計師-IOS學習筆記(二)常用關鍵字和方法
------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!-------
常用關鍵字和方法:
一.記憶體管理情況
1- autorelease,當用戶的程式碼在持續執行時,自動釋放池是不會被銷燬的,這段時間內使用者可以安全地使用自動釋放的物件。當用戶的程式碼執行告一段落,開始等待使用者的操作,自動釋放池就會被釋放掉(呼叫dealloc),池中的物件都會收到一個release,有可能會因此被銷燬。
2-成員屬性:
readonly:不指定readonly,預設合成getter和setter方法。外界毫不關心的成員,則不要設定任何屬性,這樣封裝能增加程式碼的獨立性和安全性。相當於私有成員?
assign:表示只進行簡單的賦值,不會發送retain訊息。
retain:會向舊值傳送release訊息,向新值傳送retain訊息。
copy:向舊值發release訊息,向新值傳送copy訊息。
3-引用計數特殊情況:
NSArray:當把一個物件新增到NSArray時,物件的引用計數會加1,移除時會減1。
UIView:addGestureRecognizer會對手勢識別器的引用計數加1,removeGestureRecognizer會減1。
二 .圖形API
這個講的好,清晰明確:http://www.cocoachina.com/bbs/read.php?tid=77731&page=1
1-Quartz2D,的繪圖總是發生在圖形環境(GraphicsContext)中。檢視會在呼叫drawRect:方法進行繪圖之前,建立好圖形環境,
通過UIGraphicsGetCurrentContext函式來獲得這個圖形環境。
如果直接在影象或者PDF上繪圖,需要呼叫CGBitmapContextCreate或者CGPDFContextCreate函式來建立圖形環境。
Quartz2D繪圖的基礎元素是路徑。路徑可以是一些基礎幾何形狀,也可以是這些幾何形狀的組合。
當需要建立一條路徑時,應當呼叫CGContextBeginPath函式;
當需要將路徑繪製的起點移動到一個位置時,應當呼叫CGContextMoveToPoint函式;
當想繪製一條線段時,應當呼叫CGContextAddLineToPoint。 CTM(當前變換矩陣)將繪圖從使用者空間對映到裝置控制元件。
當圖形環境剛剛建立時,CTM初始化為一個單位矩陣。
對CTM進行平移變換應當呼叫CGContextTranslateCTM函式,進行旋轉變換應當呼叫CGContextRotateCTM函式,進行縮放變換應當呼叫CGContextScaleCTM函式。
2-UIBezierPath
使用UIBezierPath繪圖的好處:
-採用系統座標系
-在CoreGraphics的基礎上封裝,具有Core Graphics的主要功能,無需考慮圖形環境。
UIBezierPath* pathLines = [UIBezierPath bezierPath];
[pathLines moveToPoint:point1]; // 移動到point1位置
[pathLines addLineToPoint:point2]; // 畫一條從point1到point2的線
pathLines.lineWidth = 5.0; // 線寬
[UIColorredColor] set]; // 顏色設定
[pathLines stroke]; // 開始描繪
在同一UIBazierPath中,只能採用相同的顏色和線寬。
可以呼叫closePath,從當前點畫一條直線到當前子路徑的初始點。如果要填充路徑,應當使用fill方法,此方法會填充路徑中得所有封閉子路徑。
三.容器
-NSArray和NSMutableArray
+array:建立一個空陣列
+arrayWithArray:從另一個數組建立新的陣列
+arrayWithContentsOfFile:讀檔案建立陣列
+arrayWithObject:建立一個數組,其中包含一個給定物件
+arrayWithObjects
+arrayWithObjects:count: 從C陣列建立
-containsObject:是否包含一個元素
-count:數量
-lastObject:返回最後一個
-objectAtIndex:返回某一個
-objectsAtIndexes:返回一組,型別為NSArray
-indexOfObject:返回物件索引
-arrayByAddingObject:原陣列最後加一個物件,產生一個新的陣列
-arrayByAddingObjectsFromArray:在原陣列的最後新增另一個數組中的所有物件,產生一個新陣列
-subarrayWithRange:抽取原陣列中得一部分,產生一個新的陣列
-isEqualToArray:比較兩個陣列是否相同
-writeToFile:atomically:儲存陣列至一個檔案
-writeToURL:atomically:儲存陣列至一個URL
-addObject:在陣列最後新增一個物件
-addObjectsFromArray:在原陣列最後新增另一個數組的全部物件
-insertObject:atIndex:向原陣列制定位置新增一個物件
-insertObjects:atIndexes:向原陣列中一系列位置新增一系列物件
-removeAllObjects:移除陣列中的全部物件
-removeLastObject:移除陣列中最後一個物件
-removeObject:移除一個物件
-removeObjectAtIndex:移除位於指定位置的物件
-removeObjectsAtIndexes:移除位於一系列位置的物件
-replaceObjectAtIndex:withObject用給定物件替換位於指定位置的物件
-replaceObjectsAtIndexes:withObjects:多物件,多位置版本
-setArray:用另一個數組中的所有物件來替換當前陣列中的所有物件
-NSDictionary與NSMutableDictionary
+dictionary
+dictionaryWithContentsOfFile
+dictionaryWithContentsOfURL
+dictionaryWithDictionary
+dictionaryWithObject:forKey
+dictionaryWithObjects:forKeys
+dictionaryWithObjectsAndKeys
-count:數量
-allKeys:返回一個數組,包含字典中的所有關鍵字。
-allKeysForObject:返回一個數組,包含所有對應到給定物件的關鍵字。
-valueForKey:通過字串查詢數值。
-writeToFile:atomically
-writeToURL:atomically
-setValue:forKey:加鍵-值對
-addEntriesFromDictionary:新增另一個字典中得所有條目
-setDictionary:將原字典中條目設定為另一個字典中得所有條目
-removeObjectForKey:移除一個關鍵字的對應條目
-removeAllObjects:移除所有條目
-removeObjectsForKeys:移除一系列關鍵字的對應條目
四.檔案系統
1- 概述
bundle(沙盒):一個應用只能在自己的沙盒中讀取或儲存檔案,而不能操作其他沙盒中的檔案。好處:保護應用的隱私不受侵犯,保護系統檔案的安排,應用刪除後相關檔案也能被全部清除。
每個應用都有自己的沙盒,沙盒的根目錄的獲取方法是NSHomeDirectory()。
根目錄下的內容:
-.app檔案,實際上是一個資料夾,包含了可執行檔案、Nib檔案、圖片資源、plist等。XCode中能看到的資源,及編譯後的可執行檔案,都封裝在app中。
-Documents資料夾,用於存放你的應用所產生的資料,該資料夾可通過iTunes備份,可以儲存遊戲進度等。
-Library資料夾,用於存放使用者偏好和臨時檔案。
-tmp資料夾是系統的中轉站。
2-檔案管理器
NSFileManager,defaultManager()返回一個檔案管理器的單例(多執行緒下不安全)。init(),在多執行緒程式設計中應儘量使用init()。
代理方法:-fileManager:shouldRemoveItemAtPath和-fileManager:shouldRemoveItemAtURL在移除操作之前被呼叫。
-removeItemAtPath:error:刪除位於指定路徑的檔案、連線、目錄(及其所有子目錄、檔案)。
-removeItemAtURL:error:同上。
-contentOfDirectoryAtPath:查詢所有位於給定路徑的子路徑和檔案。返回值為一個數組,其中包含了NSString物件。查詢只在當前目錄進行,不會進入下一層目錄。
-subpathsAtPath:查詢給定路徑下的所有子路徑。深度查詢,不限於當前層,也會查詢package的內容。
-fileExistsAtPath:判斷檔案是否位於一個路徑下面。
-isReadableFileAtPath:查詢檔案的可讀性
-isWritableFileAtPath:可寫性
-isExecutableFileAtPath:查詢檔案的可執行性
-isDeletableFileAtPath:可刪除性
3-NSString的路徑功能
-pathWithComponent:引數是一堆components構成的陣列,返回的路徑是由這些components連線而成的路徑字串,相鄰components之間用/隔開。
-pathComponents:返回一個數組,包含路徑中的components。
-fileSystemRepresentation:返回C字串
-isAbsolutePath:判斷是否為絕對路徑
-pathExtension:返回檔案的副檔名,沒有的就返回空字串
-stringByAppendingPathComponents :向現有路徑新增一個component。斜槓/會被自動加上
-stringByAppendingPathExtension:向現有路徑加上檔案的副檔名
-stringByDeletingLastPathComponent:移除最後一個路徑component
-stringByDeletingPathExtension:刪除路徑副檔名
-stringByAppendingPaths:引數為一個數組,此方法將陣列中的字串物件作為路徑一次新增到源字串後面。
例子:
NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingFormat:@"/Documents"];
五.UIActionSheet 按鈕列表
六.旋轉
1- interfaceOrientation屬性查詢當前的介面方向。
2- rotatingHeaderView方法來查詢當前導航檢視。
3- rotatingFooterView來查詢當前的標籤條。
七.快速撥打電話介面
openURL能幫助你執行Maps,SMS,Browser,Phone甚至其他的應用程式。這是Iphone開發中我經常需要用到的一段程式碼,它僅僅只有一行而已。
[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"tel://8004664411"];
這個程式通過基礎的協議支援撥打電話的功能。
摘自:http://blog.csdn.net/smilelance/article/details/6213125
八.區分裝置型別的方法
打電話功能只有iPhone支援,對於其他裝置對應按鈕應該禁用。
1. 用[UIDevicecurrentDevice].model,這個返回的是一個NSString,你可以做如下判斷就能知道裝置是iPad還是iPhone.
if ([UIDevicecurrentDevice].model rangeOfString:@"iPad"].location != NSNotFound) {
NSLog(@"This is an iPad!");
}
2. 用UI_USER_INTERFACE_IDIOM()方法,這是系統定義的一條巨集。使用方法也很簡單。
if (UI_USER_INTERFACE_IDIOM() ==UIUserInterfaceIdiomPad) {
NSLog(@"This is an iPad!");
}
摘自:http://blog.sina.com.cn/s/blog_3f88614f0100sdcm.html
九.併發程式設計
1-GCD-Grand Central Dispatch,GCD使用佇列來管理多個任務,而每個任務是以塊(其定義類似於函式)來描述的。GCD從佇列中讀取這些要完成的任務,然後其多核執行引擎負責將這些任務分配給它所管理的執行緒。和手動執行緒管理相比,GCD能極大地優化執行緒管理,並極大地減少建立和銷燬執行緒所帶來的額外開銷。除了在多核系統上得效能改進之外,GCD還能幫助提高應用的響應速度,並讓程式碼更為乾淨,易於維護。
2-NSOperationQueue-操作佇列,可以極大地減少開發者在併發程式設計中的負擔,並且操作佇列有一套Objective-C的API,使用起來方便。
基本操作單位-NSOperation,操作。
操作是封裝了一個與任務有關的程式碼與資料的抽象類,需要繼承NSOperation,並且描述相關的任務。操作物件是一次性的,它只能執行一次,下一次,需要建立一個新的例項。
可以通過addDependency:方法為操作新增相互依賴性。假設操作A依賴於操作B,如果操作B沒有結束,操作A就不會開始執行。完成是指執行完,或者取消了操作。有時需要對操作是否成功作出判斷。通過removeDependency:方法來移除操作的相互依賴性。
操作的一個屬性是isConcurrent。當使用操作佇列來管理這些操作時,isConcurrent應當設定為NO,這時應當過載 NSOperation的main函式(在類中儲存controller物件-weak,並在main中呼叫controller的方法)。 isReady屬性用於描述操作是否已經可以開始執行,isExecuting屬性表示操作是否正在執行當中,isFinished屬性表示操作是否順利完成,isCancelled屬性則表示操作已經取消。
可以在操作執行中取消它的執行,只需要給它傳送cancel訊息即可。在繼承NSOperation類時,也需要支援cancel方法。
如果只需要簡單的操作,不想繼承NSOperation類,可以使用NSInvocationOperation類,這個類中的-initWithTarget:selector:object:方法能幫助你方便地選擇人物的物件和相應的功能。
操作的執行順序取決於各自的優先順序和相互之間的依賴性。
操作佇列有兩種方式來執行其中的操作。第一種是開闢新執行緒來執行這些操作,第二種則是通過GCD來執行這些操作。但是無論如何,都不需要手動管理執行緒。儘量使用操作佇列,只有在操作佇列的效率明顯不足時才轉向GCD。因為操作佇列是封裝在GCD的基礎之上的,雖然增加了一些額外開銷,但是也具有更加完善的功能。