1. 程式人生 > >黑馬程式設計師-IOS學習筆記(二)常用關鍵字和方法

黑馬程式設計師-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的基礎之上的,雖然增加了一些額外開銷,但是也具有更加完善的功能。