绘制对象iPhone开发基础教程 笔记
每日一貼,今天的內(nèi)容關(guān)鍵字為繪制對(duì)象
????
1. 虛擬內(nèi)存????
iPhone OS其實(shí)不會(huì)將易掉性內(nèi)存(如應(yīng)用程序數(shù)據(jù))寫到交換文件,因此應(yīng)用程序可用內(nèi)存量將受到更多的制約。????
Cocoa Touch供給一種內(nèi)置機(jī)制,可以將內(nèi)存不足的情況通知給應(yīng)用程序。????
2. nib文件形成????
File's Owner是全部nib文件中的第一個(gè)圖標(biāo),它標(biāo)示從磁盤加載nib文件的對(duì)象。即,File's Owner是“具有”此nib文件的對(duì)象。????
First Responder可懂得成用戶以后正在與之交互的對(duì)象。例如,如果用戶以后正在textfield中輸入數(shù)據(jù),則該textfield就是以后的First Responder。????
First Responder將隨著用戶與界面的交互而變化。它的IB屬性為placeholders,這意味這它屬于一個(gè)虛擬實(shí)例,就不如textfield的string placeholders一樣????
只是臨時(shí)表現(xiàn)一下。真正的First Responder會(huì)被其他對(duì)象取代。實(shí)際上,任何派生自NSResponder類的對(duì)象都可以作為First Responder。而First Responder????
里面全部的Action就是NSResponder供給的或者自定義的響應(yīng)函數(shù)。????
MacOS在系統(tǒng)內(nèi)部會(huì)維護(hù)一個(gè)稱為“The Responder Chain”的鏈表。該列表內(nèi)容為Responder對(duì)象實(shí)例,它們會(huì)對(duì)各種系統(tǒng)事件做出響應(yīng)。最上面的那個(gè)對(duì)象????
就叫做First Responder,它是最早接收到系統(tǒng)事件的對(duì)象。如果該對(duì)象不處置改事件,系統(tǒng)會(huì)將這個(gè)事件向下傳遞,直到找到響應(yīng)事件的對(duì)象,我們可以理????
解 為該事件被該對(duì)象截取。????
The Responder Chain基本結(jié)構(gòu)如下圖所示: ?????
3. 線程安全????
Mutable container is not thread safe????
"不要在后臺(tái)線程更新你的UI"。其實(shí),這個(gè)說法其實(shí)不周密。首先需要把“UI更新”這個(gè)詞做一個(gè)說明,它可以有2個(gè)層次的懂得:????
首先是繪制,其實(shí)是表現(xiàn)。繪制是可以放在任何線程里停止的,但是要表現(xiàn)出來就必須在主線程操作了。比如,對(duì)一個(gè)圖片添加一個(gè)變色濾鏡,????
這個(gè)進(jìn)程便可以看成是繪制。Twitter客戶端會(huì)把一條微博表現(xiàn)成一個(gè)cell,但是速度非常快,就是因?yàn)橄葘?duì)cell做了offscreen的渲染,然后再表現(xiàn)。????
4. Subclass 和Category????
先說一下這2個(gè)特性最主要的區(qū)別。簡略可以這么懂得,subclass體現(xiàn)了類的上下級(jí)關(guān)系,而category是類間的平級(jí)關(guān)系。 ?? ????Category methods should not override existing methods (class or instance).? ? ????Two different categories implementing the same method results in undefined behavior?
????
category不僅可以為原有class添加方法,而且如果category方法與類內(nèi)某個(gè)方法具有同樣的method signature,那么category里的方法將會(huì)替換類的原有方法。????
????這是category的替換特性。利用這個(gè)特性,category還可以用來修復(fù)一些bugs。例如已宣布的Framework出現(xiàn)漏洞,如果不便于重新宣布新版本,????
????可以應(yīng)用category替換特性修復(fù)漏洞。另外,由于category有run-time級(jí)別的集成度,所以使得cocoa程序安全性有所下落。????
????許多黑客就是利用這個(gè)特性(和posting技術(shù)2)劫持函數(shù)、破解軟件,或者為軟件增加新功能。????
5.?drawing Issues?大家都知道,MacOS是一個(gè)非常重視UI的系統(tǒng)。所以在MacOS編程里繪制是一個(gè)非常重要的部分。第10部分,我會(huì)從2點(diǎn)介紹MacOS下繪制編程。首先是繪制技術(shù)分類;其次是繪制代碼結(jié)構(gòu)。?
從繪制技術(shù)分類上看,Cocoa程序員能接觸的幾種繪制技術(shù)列表如下:?
1. Cocoa Drawing(NS-prefix)?
2. Core Graphics(CG-prefix, called Quazrtz 2D)?
3. Core Animation?
4. Core Image?
5. OpenGL??
在這里我不打算給大家介紹每一種都是如何繪制詳細(xì)的圖像。只是介紹一下,它們大概長什么樣子,并且有什么優(yōu)勢和制約。?
###Cocoa Drawing?
Cocoa Drawing應(yīng)該是學(xué)習(xí)Cocoa程序開發(fā)最早接觸的繪制技術(shù)。也是目前大多數(shù)MacOS程序所應(yīng)用的繪制技術(shù),其底層應(yīng)用Quazrtz 2D(Core Graphics)。蘋果對(duì)應(yīng)文檔為 [Cocoa Drawing Guide](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Introduction/Introduction.html)。Cocoa Drawing并沒有統(tǒng)一的繪制函數(shù),全部繪制函數(shù)疏散在幾個(gè)主要的NS類的上面。例如, NSImage, NSBezierPath, NSString, NSAttributedString, NSColor, NSShadow,NSGradient …?
所以很簡略,當(dāng)你看到如下代碼便可以判斷,應(yīng)用的是Cocoa Drawing方法?
| 復(fù)制代碼 |
這類代碼多出現(xiàn)在NSView的drawRect函數(shù)內(nèi)。Cocoa Drawing 的渲染上下文是 NSGraphicsContext,我一直的看到很多新手把 NSGraphicsContext 和 CoreGraphics 的 CGContextRef 搞混。雖然它們很像并且也確實(shí)是有關(guān)系的,不過如果你不了解當(dāng)繪制時(shí)候的 render context 很多時(shí)候?qū)⒌舻粢粋€(gè)空白頁面的結(jié)果。 ?
###Core Graphics ?
Core Graphics 是 Cocoa Drawing layer 的底層技術(shù),在 iOS 開發(fā)中非常普遍,因?yàn)?iOS 系統(tǒng)中其實(shí)不存在 Cocoa layer 所以網(wǎng)上可以找到的多是 Core Graphics 繪制代碼段子,這給那些不了解 Mac 開發(fā)的新手來說造成了很大困擾。Cocoa 是 Mac OS 下的 application framework 而 iOS 下的 application framework 則是 UIKit.framework又叫 Cocoa Touch,它們分享部分代碼基礎(chǔ)但又不完全一樣。例如,Cocoa Touch 下的 UIView 的渲染上下文會(huì)應(yīng)用 UIGraphicsGetCurrentContext() 取得,它掉掉的是一個(gè) CGContextRef 指針,而在 NSView 里多用 [NSGraphicsContext currentContext] 取得渲染上下文。它掉掉的是一個(gè) NSGraphicsContext 對(duì)象。當(dāng)然 NSView 里也可以通過 CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort]; 來取得一個(gè) Core Graphics 渲染上下文。 可見 Mac OS 下的開發(fā)更為靈活一些。因?yàn)?iOS 中的 UIKit 開發(fā)初期就瞄準(zhǔn)了顯卡硬件加速,全部 UIView 都是默許 layer-backed 的。iOS 開發(fā)者必須應(yīng)用 Core Graphics 和 Core Animation 這幾個(gè)絕對(duì)底層的繪制技術(shù)。 ?
請(qǐng)看上面等價(jià)代碼,作用是繪制一個(gè)白色矩形。但是分別應(yīng)用 Core Graphics 和 Cocoa Drawing: ?
| 復(fù)制代碼 |
###Core Animation ?
如果說 Core Graphics 和 Cocoa Drawing 是通用的 UI 繪制框架的話,那么 CA 顯然是界面動(dòng)畫繪制的高級(jí)技術(shù)。 ?
Core Animation 的對(duì)應(yīng) Cocoa Animation 部分應(yīng)該是 NSAnimation 和 NSViewAnimation,但這2個(gè)差距比較大。NSAnimation 出現(xiàn)與 OS X 10.4,Core Animation 是 10.5 后出現(xiàn)的。NSViewAnimation 功能和應(yīng)用絕對(duì)簡略。 ?
簡略來說,Core Animation 的作用對(duì)象是 CALayer, NSAnimation 的作用對(duì)象是 NSView。 ?
?
????
6. MVC 每日一道理毅力,是千里大堤一沙一石的凝聚,一點(diǎn)點(diǎn)地累積,才有前不見頭后不見尾的壯麗;毅力,是春蠶吐絲一縷一縷的環(huán)繞,一絲絲地堅(jiān)持,才有破繭而出重見光明的輝煌; 毅力,是遠(yuǎn)航的船的帆,有了帆,船才可以到達(dá)成功的彼岸。
????
MVC模型將全部功能劃分紅3個(gè)不同類別:????
? ? 模型:保存應(yīng)用程序數(shù)據(jù)的類????
? ? 視圖:窗口、控件和其他用戶可以看到并能與之交互的元素的組成部分????
? ? 控制器:將模型和視圖綁定在一同,確定圖和處置用戶輸入的應(yīng)用程序邏輯????
編寫的任何對(duì)象都應(yīng)該能很明顯地劃分為其中的一類,并且其功能大部分不屬于或完全不屬于另外兩類。????
MVC可以幫助確保實(shí)現(xiàn)最大可重用性。????
????
7. 自動(dòng)旋轉(zhuǎn)屏????
? ? 分別針對(duì)不同的設(shè)備屏幕狀態(tài),設(shè)計(jì)兩個(gè)UIView 關(guān)聯(lián)到同一個(gè)xib文件中,然后都創(chuàng)立輸出口到ViewController里面,????
這樣在監(jiān)測到屏幕變換時(shí),直接設(shè)定不同View的hidden屬性,這樣就防止了自己調(diào)整控件位置。????
????
8. 多視圖????
? ? 多視圖應(yīng)用程序都應(yīng)用雷同的基本模式。????
? ? 罕見的有UINavigationController或UITabBarController,還有UIViewController自定義的子類。????
? ? 需要重點(diǎn)注意的是,多視圖控制器也是一個(gè)視圖控制器。Navigation和TabBar都是UIViewController的子類,并且可以執(zhí)行其他視圖控制器可以執(zhí)行的全部任務(wù)。????
? ? 根控制器是應(yīng)用程序的主要視圖控制器,也是指定是不是應(yīng)該自動(dòng)旋轉(zhuǎn)到新方向的視圖。????
? ??????
????內(nèi)容視圖分析:????
? ? 每一個(gè)視圖控制器(包含多視圖控制器)都控制一個(gè)內(nèi)容視圖,應(yīng)用程序的用戶界面就在這些內(nèi)容視圖中構(gòu)建。????
? ? 每一個(gè)內(nèi)容視圖通常由2或3個(gè)部分組成:視圖控制器、nib文件以及一個(gè)可選的UIView子類。????
????
9. NSBundle????
? ? NSBundle只是一種特定的文件類型,其中的內(nèi)容遵循特定的結(jié)構(gòu)。應(yīng)用程序和框架都是束NSBundle。????
? ? NSBundle的一個(gè)主要作用是取得添加到項(xiàng)目的Resources文件夾的資源。在構(gòu)建應(yīng)用程序的時(shí)候,這些文件將被復(fù)制到應(yīng)用程序的束中。????
? ? 比如,應(yīng)用mainBundle來取得需要的資源路徑:????
? ? NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"statedictionary", ofType:@"plist"];????
? ? NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];????
????
10. 首選項(xiàng)????
? ? 用戶默許設(shè)置時(shí)應(yīng)用程序首選項(xiàng)的一部分,由NSUserDefault類實(shí)現(xiàn),用于保存和取得首選項(xiàng)。????
? ? 首選項(xiàng)存儲(chǔ)在Library/Preferences文件夾中。????
????
11.對(duì)模型對(duì)象停止歸檔????
? ? 在Cocoa天下中,術(shù)語“歸檔”是指另一種情勢的序列化,但是它是任何對(duì)象都可以實(shí)現(xiàn)的更慣例的類型。專門編寫用于保存數(shù)據(jù)(模型對(duì)象)的任何對(duì)象都應(yīng)該????
? ? 支持歸檔。只要在類中實(shí)現(xiàn)的每一個(gè)屬性都是標(biāo)量(如int或float)或者都是符合NSCoding協(xié)議的某個(gè)類的實(shí)例,你便可以對(duì)你的對(duì)象停止完全的歸檔。????
? ? 由于大多數(shù)支持存儲(chǔ)數(shù)據(jù)的Foundation和Cocoa Touch類都符合NSCoding,因此比較輕易實(shí)現(xiàn)。????
? ? 盡管對(duì)應(yīng)用歸檔沒有嚴(yán)格要求,但是應(yīng)該與NSCoding一同實(shí)現(xiàn)另一個(gè)協(xié)議,即NSCopying協(xié)議,該協(xié)議允許復(fù)制對(duì)象 。????
????????
12. 基本數(shù)據(jù)持久性????
? ? 方法:首選項(xiàng)、文件、歸檔、SQLite????
????
13.應(yīng)用Quartz和OpenGL繪圖????
? ? 我們可以依托兩個(gè)不同的庫來滿足我們的繪圖需要:Quartz 2D,它是Core Craphics框架的一部分,OpenGL ES,它是跨平臺(tái)的圖形庫。????
? ? 盡管Quartz 和 OpenGL有許多個(gè)性,但它們之間存在明顯差別。????
? ? Quartz是一組函數(shù)、數(shù)據(jù)類型以及對(duì)象,專門設(shè)計(jì)用于直接在內(nèi)存中對(duì)視圖或圖像停止繪制。????
? ? 盡管在計(jì)算機(jī)圖形中最經(jīng)常使用的是RGB模型,但是它不是獨(dú)一的顏色模型。其他一些模型也掉掉了應(yīng)用,包含:????
? ? ????色調(diào)、飽和度、值(HSV)????
????? ? 色調(diào)、飽和度、亮度(HSL)????
????? ? 藍(lán)綠色、洋紅色、黃色、黑色(CMYK)????
? ??????
????盡量防止整個(gè)視圖重新繪制,而是根據(jù)需要,調(diào)用setNeedsDisplayInRect:來停止局部重繪。減少重新繪制視圖的大量任務(wù),可以在應(yīng)用程序性能????
? ? 方面發(fā)生巨大差別,尤其是當(dāng)應(yīng)用程序變得更加復(fù)雜時(shí)。????
????????????
14. 輕擊、觸摸和手勢????
? ? 手勢gesture是指從你用一個(gè)或多個(gè)手指接觸屏幕時(shí)開始,直到你的手指分開屏幕為止所發(fā)生的多有事件。無論它話費(fèi)了多長事件,只要一個(gè)或????
? ? 多個(gè)手指仍在屏幕上,你就仍然位于某個(gè)手勢之中(除非傳入電話呼叫等系統(tǒng)事件中斷該手勢)。? ? iPhone只跟蹤應(yīng)用一個(gè)手指時(shí)的輕擊,記住這一點(diǎn)非常重要。如果她檢測到多個(gè)觸摸,則會(huì)將輕擊計(jì)數(shù)重置為1.
????
? ? 響應(yīng)者鏈 responder chain????
? ? 由于手勢是在時(shí)光以內(nèi)傳遞到系統(tǒng)的,然后事件會(huì)傳遞到響應(yīng)者鏈。如果第一個(gè)響應(yīng)者不處置某個(gè)特別事件,則她會(huì)將改時(shí)光傳遞到響應(yīng)者鏈的下一級(jí)。????
????????
15. Core Location定位????
? ? iPhone可以應(yīng)用Core Location framework來確定它的物理位置。Core Location可以利用三種技術(shù)來實(shí)現(xiàn)該功能:????
? ? GPS、蜂窩基站三角定位、wifi定位服務(wù)。????
? ? GPS是三種技術(shù)中最精確的,但是在第一代iPhone上不可用。我們只需要傳入精確度,不需要指定采取方法。系統(tǒng)本身會(huì)停止確定。????
? ? Cocoa Touch應(yīng)用的主要類是:CLLocationManager。????
? ? 請(qǐng)記住你要求的精確度越高,消費(fèi)的電量就會(huì)越多;其實(shí)不能保證你會(huì)取得所需精度級(jí)別。????
? ? 通過指定距離篩選器可以告知位置管理器不要將每一個(gè)變動(dòng)都通知其代理,僅當(dāng)位置變動(dòng)超過特定數(shù)量是才通知其代理。????
? ? 如果只是需要確定以后位置而不是需要連續(xù)輪詢位置,則當(dāng)它取得應(yīng)用程序所需要信息之后,應(yīng)該停止位置管理器。????
? ? 取得越精確的位置,就需要更多的電量。????
????
16. 加速計(jì)????
? ? 通過感知特定方向的慣性力總量,加速計(jì)可以測量出加速度和重力。????
? ? iPhone內(nèi)的加速計(jì)是一個(gè)3軸加速器,這意味著它可以檢測到三維空間中的運(yùn)動(dòng)或重力引力。 應(yīng)用的類為 UIAccelerometer。????
????????
17. 應(yīng)用程序本地化文章結(jié)束給大家分享下程序員的一些笑話語錄: 程序員打油詩
寫字樓里寫字間,寫字間里程序員;
程序人員寫程序,又拿程序換酒錢。
酒醒只在網(wǎng)上坐,酒醉還來網(wǎng)下眠;
酒醉酒醒日復(fù)日,網(wǎng)上網(wǎng)下年復(fù)年。
但愿老死電腦間,不愿鞠躬老板前;
奔馳寶馬貴者趣,公交自行程序員。
別人笑我忒瘋癲,我笑自己命太賤;
不見滿街漂亮妹,哪個(gè)歸得程序員。
總結(jié)
以上是生活随笔為你收集整理的绘制对象iPhone开发基础教程 笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库范式笔记
- 下一篇: java判断回文数代码实例