你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iPhone開發基礎教程 筆記

iPhone開發基礎教程 筆記

編輯:關於IOS

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基本結構如下圖所示:

 

iPhone開發基礎教程 筆記

3. 線程安全
Mutable container is not thread safe

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

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

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

4. Subclass 和Category
先說一下這2個特性最主要的區別。簡單可以這麼理解,subclass體現了類的上下級關系,而category是類間的平級關系。
iPhone開發基礎教程 筆記
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. 應用程序本地化

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved