iPhone開發基礎教程 筆記

來源:互聯網
上載者:User

1. 虛擬記憶體
    iPhone OS並不會將易失性記憶體(如應用程式資料)寫到分頁檔,因此應用程式可用記憶體量將受到更多的限制。

    Cocoa Touch提供一種內建機制,可以將記憶體不足的情況通知給應用程式。

2. nib檔案構成
    File's Owner是所有nib檔案中的第一個表徵圖,它標示從磁碟載入nib檔案的對象。即,File's Owner是“擁有”此nib檔案的對象。

    First Responder可理解成使用者當前正在與之互動的對象。例如,如果使用者當前正在textfield中輸入資料,則該textfield就是當前的First Responder。

    First Responder將隨著使用者與介面的互動而變化。它的IB屬性為placeholders,這意味這它屬於一個虛擬執行個體,就不如textfield的string placeholders一樣

    只是臨時顯示一下。真正的First Responder會被其他對象代替。實際上,任何派生自NSResponder類的對象都可以作為First Responder。而First Responder
    裡面所有的Action就是NSResponder提供的或者自訂的響應函數。
    MacOS在系統內部會維護一個稱為“The Responder Chain”的鏈表。該列表內容為Responder對象執行個體,它們會對各種系統事件做出響應。最上面的那個對象
    就叫做First Responder,它是最先接收到系統事件的對象。如果該對象不處理改事件,系統會將這個事件向下傳遞,直到找到響應事件的對象,我們可以理
    解為該事件被該對象截取。
    The Responder Chain基本結構如所示: 

 

 
 


3. 安全執行緒
    Mutable container is not thread safe

    "不要在後台線程更新你的UI"。其實,這個說法並不嚴密。首先需要把“UI更新”這個詞做一個說明,它可以有2個層次的理解:

    首先是繪製,其實是顯示。繪製是可以放在任何線程裡進行的,但是要顯示出來就必須在主線程操作了。比如,對一個圖片添加一個變色濾鏡,

    這個過程就可以看成是繪製。Twitter用戶端會把一條微博顯示成一個cell,但是速度非常快,就是因為先對cell做了offscreen的渲染,然後再顯示。

4. Subclass 和Category
    先說一下這2個特性最主要的區別。簡單可以這麼理解,subclass體現了類的上下級關係,而category是類間的平級關係。
  
    Category methods should not override existing methods (class or instance).  
    Two different categories implementing the same method results in undefined behavior
    category不僅可以為原有class添加方法,而且如果category方法與類內某個方法具有同樣的method signature,那麼category裡的方法將會替換類的原有方法。
    這是category的替換特性。利用這個特性,category還可以用來修複一些bugs。例如已經發布的Framework出現漏洞,如果不便於重新發布新版本,
    可以使用category替換特性修複漏洞。另外,由於category有run-time層級的整合度,所以使得cocoa程式安全性有所下降。
    許多駭客就是利用這個特性(和posting技術2)劫持函數、破解軟體,或者為軟體增加新功能。

5. drawing Issues
大家都知道,MacOS是一個非常注重UI的系統。所以在MacOS編程裡繪製是一個非常重要的部分。第10部分,我會從2點介紹MacOS下繪製編程。首先是繪製技術分類;其次是繪製代碼結構。
從繪製技術分類上看,Cocoa程式員能接觸的幾種繪製技術列表如下:
1. Cocoa Drawing(NS-prefix)
2. Core Graphics(CG-prefix, called Quazrtz 2D)
3. Core Animation
4. Core Image
5. OpenGL 
在這裡我不打算給大家介紹每一種都是如何繪製具體的映像。只是介紹一下,它們大概長什麼樣子,並且有什麼優勢和限制。
###Cocoa Drawing
Cocoa Drawing應該是學習Cocoa程式開發最先接觸的繪製技術。也是目前大多數MacOS程式所使用的繪製技術,其底層使用Quazrtz 2D(Core Graphics)。蘋果對應文檔為 [Cocoa Drawing Guide](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Introduction/Introduction.html)。Cocoa Drawing並沒有統一的繪製函數,所有繪製函數分散在幾個主要的NS類的下面。例如, NSImage, NSBezierPath, NSString, NSAttributedString, NSColor, NSShadow,NSGradient …
所以很簡單,當你看到如下代碼就可以判斷,使用的是Cocoa Drawing方法
複製代碼 [anImage drawInRect:rect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[@"some text" drawAtPoint:NSZeroPoint withAttributes:attrs];
NSBezierPath *p=[NSBezierPath bezierPathWithRect:rect];
[[NSColor redColor] set];
[p fill];
 
 
這種代碼多出現在NSView的drawRect函數內。Cocoa Drawing 的渲染上下文是 NSGraphicsContext,我不斷的看到很多新手把 NSGraphicsContext 和 CoreGraphics 的 CGContextRef 搞混。雖然它們很像並且也確實是有關係的,不過如果你不瞭解當繪製時候的 render context 很多時候將得到一個空白頁面的結果。
###Core Graphics
Core Graphics 是 Cocoa Drawing layer 的底層技術,在 iOS 開發中非常普遍,因為 iOS 系統中並不存在 Cocoa layer 所以網上可以找到的多是 Core Graphics 繪製程式碼片段子,這給那些不瞭解 Mac 開發的新手來說造成了很大困擾。Cocoa 是 Mac OS 下的 application framework 而 iOS 下的 application framework 則是 UIKit.framework又叫 Cocoa Touch,它們分享部分代碼基礎但又不完全一樣。例如,Cocoa Touch 下的 UIView 的渲染上下文會使用 UIGraphicsGetCurrentContext() 取得,它得到的是一個 CGContextRef 指標,而在 NSView 裡多用 [NSGraphicsContext currentContext] 取得渲染上下文。它得到的是一個 NSGraphicsContext 對象。當然 NSView 裡也可以通過 CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort]; 來取得一個 Core Graphics 渲染上下文。 可見 Mac OS 下的開發更為靈活一些。因為 iOS 中的 UIKit 開發初期就瞄準了顯卡硬體加速,所有 UIView 都是預設 layer-backed 的。iOS 開發人員必須使用 Core Graphics 和 Core Animation 這幾個相對底層的繪製技術。
請看下面等價代碼,作用是繪製一個白色矩形。但是分別使用 Core Graphics 和 Cocoa Drawing:
複製代碼 const CGFloat white[]={ 1.0, 1.0, 1.0, 1.0 };
CGContextSetFillColor(cgContextRef, white);
CGContextSetBlendMode(cgContextRef, kCGBlendModeNormal);
CGContextFillRect(cgContextRef, CGRectMake(0, 0, width, height));
[[NSColor whiteColor] set];
NSRectFillUsingOperation(NSMakeRect(0, 0, width, height), NSCompositeSourceOver);
 
可以看出,這是2種*風格完全不同*的繪製技術。Cocoa Drawing 是分散式的繪製函數,而 Core Graphics 是傳統的類似 OpenGL 的整合式的繪製方式。其實 Cocoa Drawing 下層是 Core Graphics, Core Graphics 的下層是 OpenGL。 
###Core Animation
如果說 Core Graphics 和 Cocoa Drawing 是通用的 UI 繪製架構的話,那麼 CA 顯然是介面動畫繪製的進階技術。
Core Animation 的對應 Cocoa Animation 部分應該是 NSAnimation 和 NSViewAnimation,但這2個差距比較大。NSAnimation 出現與 OS X 10.4,Core Animation 是 10.5 後出現的。NSViewAnimation 功能和使用相對簡單。
簡單來說,Core Animation 的作用對象是 CALayer, NSAnimation 的作用對象是 NSView。
 

6. MVC
MVC模型將所有功能劃分成3個不同類別:
    模型:儲存應用程式資料的類

    視圖:視窗、控制項和其他使用者可以看到並能與之互動的元素的組成部分

    控制器:將模型和視圖綁定在一起,確定圖和處理使用者輸入的應用程式邏輯

編寫的任何對象都應該能很明顯地劃分為其中的一類,並且其功能大部分不屬於或完全不屬於另外兩類。
MVC可以協助確保實現最大可重用性。


7. 自動旋轉屏
    分別針對不同的裝置螢幕狀態,設計兩個UIView 關聯到同一個xib檔案中,然後都建立輸出口到ViewController裡面,

這樣在監測到螢幕變換時,直接設定不同View的hidden屬性,這樣就避免了自己調整控制項位置。


8. 多視圖
    多視圖應用程式都使用相同的基本模式。

    常見的有UINavigationController或UITabBarController,還有UIViewController自訂的子類。

    需要重點注意的是,多視圖控制器也是一個視圖控制器。Navigation和TabBar都是UIViewController的子類,並且能夠執行其他視圖控制器能夠執行的所有工作。

    根控制器是應用程式的主要視圖控制器,也是指定是否應該自動旋轉到新方向的視圖。

   
    內容視圖剖析:

    每個視圖控制器(包括多視圖控制器)都控制一個內容視圖,應用程式的使用者介面就在這些內容視圖中構建。

    每個內容視圖通常由2或3個部分組成:視圖控制器、nib檔案以及一個可選的UIView子類。

 

9. NSBundle
    NSBundle只是一種特定的檔案類型,其中的內容遵循特定的結構。應用程式和架構都是束NSBundle。

    NSBundle的一個主要作用是擷取添加到項目的Resources檔案夾的資源。在構建應用程式的時候,這些檔案將被複製到應用程式的束中。

    比如,使用mainBundle來擷取需要的資源路徑:

    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"statedictionary", ofType:@"plist"];

    NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

 

10. 喜好設定
    使用者預設設定時應用程式喜好設定的一部分,由NSUserDefault類實現,用於儲存和擷取喜好設定。

    喜好設定儲存在Library/Preferences檔案夾中。

 

11.對模型對象進行歸檔
    在Cocoa世界中,術語“歸檔”是指另一種形式的序列化,但是它是任何對象都可以實現的更常規的類型。專門編寫用於儲存資料(模型對象)的任何對象都應該

    支援歸檔。只要在類中實現的每個屬性都是標量(如int或float)或者都是符合NSCoding協議的某個類的執行個體,你就可以對你的對象進行完整的歸檔。

    由於大多數支援儲存資料的Foundation和Cocoa Touch類都符合NSCoding,因此比較容易實現。

    儘管對使用歸檔沒有嚴格要求,但是應該與NSCoding一起實現另一個協議,即NSCopying協議,該協議允許複製對象。
   

12. 基本資料持久性
    方式:喜好設定、檔案、歸檔、SQLite

 

13.使用Quartz和OpenGL繪圖
    我們可以依靠兩個不同的庫來滿足我們的繪圖需要:Quartz 2D,它是Core Craphics架構的一部分,OpenGL ES,它是跨平台的圖形庫。
    儘管Quartz 和 OpenGL有許多共性,但它們之間存在明顯差別。

    Quartz是一組函數、資料類型以及對象,專門設計用於直接在記憶體中對視圖或映像進行繪製。

    儘管在電腦圖形中最常用的是RGB模型,但是它不是唯一的顏色模型。其他一些模型也得到了使用,包括:

        色調、飽和度、值(HSV)

        色調、飽和度、亮度(HSL)

        藍綠色、洋紅色、黃色、黑色(CMYK)

   

    盡量避免整個視圖重新繪製,而是根據需要,調用setNeedsDisplayInRect:來進行局部重繪。減少重新繪製視圖的大量工作,可以在應用程式效能
    方面產生巨大差別,尤其是當應用程式變得更加複雜時。

       

14. 輕擊、觸摸和手勢
    手勢gesture是指從你用一個或多個手指接觸螢幕時開始,直到你的手指離開螢幕為止所發生的多有事件。無論它話費了多長事件,只要一個或

    多個手指仍在螢幕上,你就仍然位於某個手勢之中(除非傳入撥打電話等系統事件中斷該手勢)。
    iPhone只跟蹤使用一個手指時的輕擊,記住這一點非常重要。如果她檢測到多個觸摸,則會將輕擊計數重設為1.

    響應者鏈 responder chain

    由於手勢是在時間之內傳遞到系統的,然後事件會傳遞到響應者鏈。如果第一個響應者不處理某個特殊事件,則她會將改時間傳遞到響應者鏈的下一級。

   

15. Core Location定位
    iPhone可以使用Core Location framework來確定它的物理位置。Core Location可以利用三種技術來實現該功能:

    GPS、蜂窩基站三角定位、wifi定位服務。

    GPS是三種技術中最精確的,但是在第一代iPhone上不可用。我們只需要傳入精確度,不需要指定採用方式。系統本身會進行確定。

    Cocoa Touch使用的主要類是:CLLocationManager。

    請記住你要求的精確度越高,消耗的電量就會越多;並不能保證你會獲得所需精度層級。
    通過指定距離篩選器可以告知位置管理器不要將每個更改都通知其代理,僅當位置更改超過特定數量是才通知其代理。

    如果只是需要確定當前位置而不是需要連續輪詢位置,則當它擷取應用程式所需要資訊之後,應該停止位置管理器。

    擷取越精確的位置,就需要更多的電量。

 

16. 加速計
    通過感知特定方向的慣性力總量,加速計可以測量出加速度和重力。

    iPhone內的加速計是一個3軸加速器,這意味著它能夠檢測到三維空間中的運動或重力引力。 使用的類為 UIAccelerometer。

   

17. 應用程式本地化

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.