1.簡介java
IOS是由蘋果公司爲iPhone、iPod touch和iPad等設備開發的操做系統。mysql
2.知識點ios
iPhone OS(如今叫iOS)是iPhone, iPod touch 和 iPad 設備的操做系統。git
iOS系統架構:基於UNIX。分爲4個層次:
核心操做系統層(最底層)Core OS
核心服務層 Core Services
媒體層 Media
可觸摸層 Cocoa Touchgithub
一、Core OS:面試
它是用FreeBSD和Mach所改寫的Darwin, 是開源、符合POSIX標準的一個Unix核心。這一層包含或者說是提供了整個iPhone OS的一些基礎功能,好比:硬件驅動, 內存管理,程序管理,線程管理(POSIX),文件系統,網絡(BSD Socket),以及標準輸入輸出等等,全部這些功能都會經過C語言的API來提供。另外,值得一題的是,這一層最具備UNIX色彩,若是你須要把 UNIX上所開發的程序移植到iPhone上,多半都會使用到Core OS的API.objective-c
核心OS層的驅動也提供了硬件和系統框架之間的接口。然而,因爲安全的考慮,只有有限的系統框架類能訪問內核和驅動。
iPhone OS提供了許多訪問操做系統低層功能的接口集,iPhone 應用經過LibSystem庫來訪問這些功能,這些接口集以下所示:
線程(POSIX線程)
網絡(BSD sockets)
文件系統訪問
標準I/O
Bonjour和DNS服務
現場信息(Locale Information)
內存分配
數學計算
許多Core OS技術的頭文件位於目錄<iPhoneSDK>/usr/include/,iPhoneSDK是SDK的安裝目錄。算法
二、Core Services:sql
Core Services在Core OS基礎上提供了更爲豐富的功能, 它包含了Foundation.Framework和Core Foundation.Framework, 之因此叫Foundation ,就是由於它提供了一系列處理字串,排列,組合,日曆,時間等等的基本功能。Foundation是屬於Objective-C的API,Core Fundation是屬於C的API。另外Core servieces還提供了其餘的功能,好比:
Security, Core Location, SQLite, 和Address Book. 其中Security是用來處理認證,密碼管理,按安全性管理的; Core Location是用來處理GPS定位的;SQLLite是輕量級的數據庫,而AddressBook則用來處理電話薄資料的。下面是具體介紹:
(1)電話本
電話本框架(AddressBook.framework)提供了保存在手機設備中的電話本編程接口。開發者能使用該框架訪問和修改存儲在用戶聯繫 人數據庫裏的記錄。例如,一個聊天程序可使用該框架得到可能的聯繫人列表,啓動聊天的進程(Process),並在視圖上顯示這些聯繫人信息等。
(2)核心基礎框架
核心基礎框架(CoreFoundation.framework)是基於C語言的接口集,提供iPhone應用的基本數據管理和服務功能。該框架 支持以下功能:
Collection數據類型(Arrays、 Sets等);
Bundles;
字符串管理;
日期和時間管理;
原始數據塊管理;
首選項管理;
URL和Stream操做;
線程和運行循環(Run Loops);
端口和Socket通訊。
核心基礎框架與基礎框架是緊密相關的,它們爲相同的基本功能提供了Objective-C接口。若是開發者混合使用Foundation Objects 和Core Foundation類型,就能充分利用存在兩個框架中的"toll-free bridging"。toll-free bridging意味着開發者能使用這兩個框架中的任何一個的核心基礎和基礎類型,例如Collection和字符串類型等。每一個框架中的類和數據類型的 描述註明該對象是否支持toll-free bridged。若是是,它與哪一個對象橋接(toll-free bridged)。
(3)CFNetwork
CFNetwork框架(CFNetwork.framework)是一組高性能的C語言接口集,提供網絡協議的面向對象的抽象。開發者可使用 CFNetwork框架操做協議棧,而且能夠訪問低層的結構如BSD Sockets等。同時,開發者也能簡化與FTP和HTTP服務器的通訊,或解析DNS等任務。使用CFNetwork框架實現的任務以下所示:
BSD Sockets;
利用SSL或TLS建立加密鏈接;
解析DNS Hosts;
解析HTTP協議,鑑別HTTP和HTTPS服務器;
在FTP服務器工做;
發佈、解析和瀏覽Bonjour服務。
(4)核心位置框架(Core Location Framework)
核心位置框架(CoreLocation.framework)主要得到手機設備當前的經緯度,核心位置框架利用附近的GPS、蜂窩基站或Wi- Fi信號信息測量用戶的當前位置。iPhone地圖應用使用這個功能在地圖上顯示用戶的當前位置。開發者能融合這個技術到本身的應用中,給用戶提供一些位 置信息服務。例如能夠提供一個服務:基於用戶的當前位置,查找附近的餐館、商店或設備等。
(5)安全框架(Security Framework)
iPhone OS除了內置的安全特性外,還提供了外部安全框架(Security.framework),從而確保應用數據的安全性。該框架提供了管理證書、公鑰/私 鑰對和信任策略等的接口。它支持產生加密安全的僞隨機數,也支持保存在密鑰鏈的證書和密鑰。對於用戶敏感的數據,它是安全的知識庫(Secure Repository)。CommonCrypto接口也支持對稱加密、HMAC和數據摘要。在iPhone OS裏沒有OpenSSL庫,可是數據摘要提供的功能在本質上與OpenSSL庫提供的功能是一致的。
(6)SQLite
iPhone應用中能夠嵌入一個小型SQL數據庫SQLite,而不須要在遠端運行另外一個數據庫服務器。開發者能夠建立本地數據庫文件,並管理這些 文件中的表格和記錄。數據庫SQLite爲通用的目的而設計,但仍能夠優化爲快速訪問數據庫記錄。訪問數據庫SQLite的頭文件位 於<iPhoneSDK>/usr/include/sqlite3.h,其中<iPhoneSDK>是SDK安裝的目標路徑。
(7)支持XML
基礎框架提供NSXMLParser類,解析XML文檔元素。libXML2庫提供操做XML內容的功能,這個開放源代碼的庫能夠快速解析和編輯 XML數據,而且轉換XML內容到HTML。訪問libXML2庫的頭文件位於目錄<iPhoneSDK>/usr/include /libxml2/,其中<iPhoneSDK>是SDK安裝的目標目錄。數據庫
三、Media:
如同其名,Media層提供了圖片,音樂,影片等多媒體功能。圖像分爲2D圖像和3D圖像, 前者由Quartz2D來支持,後者則是用OpenglES.與音樂對應的模組是Core Audio和OpenAL, Media Player 實現了影片的播放, 而最後還提供了Core Animation來對強大動畫的支持。具體介紹以下:
(1)圖像技術(Graphics Technologies)
高質量圖像是全部iPhone應用的一個重要的組成部分。任什麼時候候,開發者能夠採用UIKit 框架中已有的視圖和功能以及預約義的圖像來開發iPhone應用。然而,當UIKit 框架中的視圖和功能不能知足需求時,開發者能夠應用下面描述的技術和方法來製做視圖。
① Quartz。核心圖像框架(CoreGraphics.framework)包含了Quartz 2D畫圖API,Quartz與在Mac OS中採用的矢量圖畫引擎是同樣先進的。Quartz支持基於路徑(Path-based)畫圖、抗混淆(Anti-aliased)重載、梯度 (Gradients)、圖像(Images)、顏色(Colors)、座標空間轉換(Coordinate-space Transformations)、pdf文檔建立、顯示和解析。雖然API是基於C語言的,它採用基於對象的抽象表徵基礎畫圖對象,使得圖像內容易於保存和複用。
② 核心動畫(Core Animation)。Quartz核心框架(QuartzCore.framework)包含CoreAnimation接口,Core Animation是一種高級動畫和合成技術,它用優化的重載路徑(Rendering Path)實現複雜的動畫和虛擬效果。它用一種高層的Objective-C接口配置動畫和效果,而後重載在硬件上得到較好的性能。Core Animation集成到iPhone OS 的許多部分,包括UIKit類如UIView,提供許多標準系統行爲的動畫。開發者也能利用這個框架中的Objective-C接口建立客戶化的動畫。
③ OpenGL ES。OpenGL ES框架(OpenGLES.framework)符合OpenGL ES v1.1規範,它提供了一種繪畫2D和3D內容的工具。OpenGL ES 框架是基於C語言的框架,與硬件設備緊密相關,爲全屏遊戲類應用提供高幀率(high frame rates)。開發者老是要使用OpenGL框架的EAGL接口,EAGL接口是OpenGL ES框架的一部分,它提供了應用的OpenGL ES畫圖代碼和本地窗口對象的接口。
(2)音頻技術(Audio Technologies)
iPhone OS的音頻技術爲用戶提供了豐富的音頻體驗。它包括音頻回放,高質量的錄音和觸發設備的振動功能等。
iPhone OS的音頻技術支持以下音頻格式:AAC、Apple Lossless(ALAC)、A-law、IMA/ADPCM(IMA4)、Linear PCM、μ-law和Core Audio等。
① 核心音頻(Core Audio Family)。核心音頻框架家族(Core Audio family of frameworks)提供了音頻的本地支持,如表16-1所示。Core Audio是一個基於C語言的接口,並支持立體聲(Stereo Audio)。開發能採用iPhone OS 的Core Audio框架在iPhone 應用中產生、錄製、混合和播放音頻。開發者也能經過核心音頻訪問手機設備的振動功能。
核心音頻框架:
CoreAudio.framework 定義核心音頻的音頻數據類型
AudioUnit.framework 提供音頻和流媒體文件的回放和錄製,而且管理音頻文件和播放提示聲音
AudioToolbox.framework 提供使用內置音頻單元服務,音頻處理模塊
② OpenAL。iPhone OS 也支持開放音頻庫(Open Audio Library, OpenAL)。OpenAL是一個跨平臺的標準,它能傳遞位置音頻(Positional Audio)。開發者能應用OpenAL在須要位置音頻輸出的遊戲或其餘應用中實現高性能、高質量的音頻。
因爲OpenAL是一個跨平臺的標準,採用OpenAL的代碼模塊能夠平滑地移植到其餘平臺。
(3)視頻技術(Video Technologies)
iPhone OS經過媒體播放框架(MediaPlayer.framework)支持全屏視頻回放。媒體播放框架支持的視頻文件格式包括.mov, .mp4,.m4v和.3gp,並應用以下壓縮標準:
① H.264 Baseline Profile Level 3.0 video,在30 f/s 的狀況下分辨率達到640×480像素。注意:不支持B frames;
② MPEG4規範的視頻部分;
③ 衆多的音頻格式,包含在音頻技術的列表裏,如AAC、Apple Lossless (ALAC)、A-law、IMA/ADPCM(IMA4)、線性PCM、μ-law和Core Audio等。
委託機制是Cocoa Touch的一種設計模式,Core location框架則是提供IOS內建的位置定位功能。
編譯源代碼分爲兩個步驟:預處理和編譯。
主要類:MKMapView(顯示地圖、以及地圖相關操做)
新建立的空XIB文件只有兩個對象:文件全部者和第一響應對象。做用是爲CurrentTimeViewController建立視圖。
UIView子類都會實現drawRect:方法,其中包含和繪製視圖有關的代碼。每次繪製UIView實例時,系統會爲視圖專門準備一個繪圖上下文( CGContextRef context = UIGraphicsGetCurrentContext() )。
接着系統會激活該上下文,而後向須要回執的UIView對象發送drawRect:消息。
注意:只能在drawRect:方法中調用繪圖方法或函數。
除了drawRect:方法,沒法從其餘地方得到激活狀態的CGContextRef.也就沒法調用灰土方法或函數。
爲了讓用戶可以滾動視圖,能夠將視圖設置爲UIScrollView的子視圖,主要涉及它的setContentSize方法。
要實現縮放功能,則須要爲UIScrollView設置委託對象UIScrollViewDelegate協議並使用setMinimumZoomScale,setMaximumZoomScale方法來啓用縮放功能,且要實現viewForZoomingInScrollView:(該方法返回UIScrollView對象須要縮放的視圖)。
[UIApplication shareApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]
負責視圖的交換工做,使用時可能涉及到的方法是setViewControllers:,給該方法傳入每一個Tab對應的ViewController數組。(每一個視圖控制對象都有一個類型爲UITabBarItem的實例變量,負責標籤條上顯示的文字和圖標)。
實現了一個名爲setRootViewController:的方法,將UIViewController實例做爲參數傳入該方法,傳入的視圖控制對象的視圖會自動加入該窗口,成爲窗口的子視圖並調整大小和窗口保持一致。窗口對象也會保留它的根視圖對象。
建立UIViewController子類實例時,經過指定初始化方法 initWithNibName:bundle: 傳入XIB的文件名。當視圖控制對象須要使用實例變量view的時候,會查看應用程序包內是否存在相應名稱的XIB文件(若是傳入的名稱是nil,那麼UIViewController對象會查找和這個UIViewController子類的類名匹配的XIB文件)。
視圖控制對象也是經過alloc和init建立的,可是視圖控制對象只有在真正須要視圖是,纔會經過調用loadView來建立,這種作法可以提升內存使用效率。
注意:
一、在UIViewController裏面使用了timer,會使得controller被retain,所以在viewdisapper時應將timer置爲nil,不然controller的dealloc不會被執行。
二、若是在UIViewController裏面使用ASIHttprequest發送了async請求,而且將request的delegate設置爲controller,若請求沒回來時就銷燬了controller,會使得request的delegate變爲野指針,解決方案是:銷燬controller時,調用request的cancel來取消請求,或者將request的delegate設置爲nil。另一種應對delegate變爲野指針的方法是,假設delegate的類是A ,若object_getClass(delegate) != [A class] 說明是野指針了,此時就不能對delegate調用函數了。
一、使用UITableView時必需要指定它的數據源,該數據源必須遵照 UITableViewDataSource 協議 ,同時也要爲 UItableView 對象設置 UITableViewDelegate 委託, UITableViewController 能夠做爲 UITableView的數據源、視圖控制對象和委託對象。
二、幾個關於UITableVIewController的重要方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; //返回table中section的個數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section //返回每一個Section的行數
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath //具體行
三、UITableViewCell是UIView的子類。UITableViewCell對象也有本身的子視圖:contentView,真正負責顯示UITableViewCell的是contentView下的另外三個子視圖,分別是:textLabel detailTextLabel imageView. UITableViewCell還有一個UITableViewCellStyle屬性,用於決定使用那些子視圖以及這些子視圖在contentView中的位置。
四、重用UITableViewCell對象,因爲IOS設備內存有限,因此必須採用重用UITableViewCell對象的機制。即當用戶滾動表格是,部分UITableViewCell對象會移出窗口,咱們把移出的UITableViewCell對象放入UITableViewCell對象池,等待重用。每一個UITableViewCell對象都有一個 reuseIdentifier 屬性,類型爲NSString,經過想表格視圖傳入特定的NSString對象,數據源就能夠查詢並獲取一個可重用的UITableViewCell對象。以下列代碼是獲取可重用對象:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
五、UITableView對象有一個editing屬性,設置爲YES時,UITableView對象就會進入編輯模式。
一、UITabBarController對象能夠切換沒有相互依存關係的狀況的視圖,而且必須在初始化時設置好全部的視圖控制對象,但若是屏幕鍵互有關聯,就要使用導航控制對象。
二、使用 UINavigationController顯示多個屏幕的信息時,他會以棧的形式保存全部的屏幕,這裏的棧實際上是NSArray對象,經過發送viewController消息能夠獲得整個棧(返回一個NSArray對象),也可使用push和pop兩種方法的推入和推出視圖。
三、UIViewController對象有一個navigationItem屬性,類型爲UINavigationItem.和UINavigationBar不一樣,UINavigationItem不是UIView的子類,不能在屏幕上顯示,但 UINavigationItem 可以爲 UINavigationBar對象提供繪圖所需的內容。當某個UIViewController對象成爲UINavigationController的棧頂對象時,UINavigationBar對象會使用UIViewController對象的navigationItem並設置相應的屬性。UINavigationItem能夠包含leftBarButtonItem rightBarButtonItem titleView三個能夠自定義的部分。
四、SEL的數據類型是指針,指向選擇器(selector)。選擇器是方法的惟一標識。將方法名傳給 @selector() 指令,能夠獲得指向相應方法的SEL(@selector不會檢查相應的方法是否存在)。
五、UIView實例存在一個endEditing:消息,當視圖收到該消息時,若是視圖是當前的第一相應對象,就會取消本身的第一響應對象狀態,並且虛擬鍵盤也會消失(傳入的參數表明是否須要強制取消第一響應對象狀態,YES表明強制退出), textField也能夠經過resignFirstResponder來取消第一響應狀態。
一、UIImageView對象會根據contentMode屬性顯示圖片,該屬性決定圖片在frame中的顯示位置和縮放模式,默認值是UIViewContentModeCenter(即根據UIImageView對象的bounds居中顯示圖片,沒有縮放),此外還有屬性UIViewContentModeScaleToFill/AspectFit/AspectFill等.
二、UIToolbar對象和UINavigationBar相似,區別是UINavigationBar只能有兩個UIBarButtonItem對象,而UIToolbar能夠有一組UIBarButtonItem對象。
三、啓用相機拍照功能須要用到UIImagePickerController實例,而且必須設定其實例屬性sourceType並設置委託對象(UIImagePickerControllerDelegate),此外,因爲UIImagePickerController是UINavigationController的子類,因此也須要遵照UINavigationControllerDelegate協議。
sourceType有三種 :
四、在彈出照片選擇的視圖的時候,咱們會用到當前視圖控制器的presentModalViewController:animated:方法以模態的形式顯示視圖,關閉時也須要用到dismissModalViewControllerAnimated:方法。
五、 類型爲CFUUIDRef的對象能夠表明UUID(GUID),CFUUIDRef不是Objective-C對象,而是由Core Foundation API提供的C結構。Core Foundation是一套C語言API,包含編寫應用所需的基本構件,例如字符串、數組對象和字典對象。
Core Foundation類以CF爲前綴,以Ref爲後綴。須要注意的是:不少Core Foundation對象都有Objective-C版本,例如 NSString,NSArray等,但CFUUIDRef沒有,而且和Objective—C沒有任何關聯。慶幸的是咱們只須要簡單的類型轉換就能夠將它轉換爲字符串形式,這種特性稱爲無損橋接(toll-free bridging).
代碼示例:
CFUUIDRef newUniqueID = CFUUIDCreate(kCFAllocatorDefault);
CFUUIDRef newUniqueIDString = CFUUIDCreateString(kCFAllocatorDefault, newUniqueID);
使用完畢後要釋放對象(當C函數的函數名包含英文單詞Create時,條用房須要負責釋放返回對象):CFRelease(newUniqueID); CFRelease(newUniqueIDString);
六、取消點擊textField出現的鍵盤:[textField resignFirstResponder]; //取消第一響應對象狀態
一、前面瞭解到,如今有四種顯示視圖控制對象的方法:
設置UIWindow實例的跟視圖控制對象、壓入UINavigationController棧,加入UITabBarController對象和以模態形式顯示。
二、UIViewController對象會在運行時自動根據當前的設備載入不一樣的XIB文件。UIViewController對象擁有一個nibName屬性,建立該對象時,須要經過初始化方法爲這個nibName屬性賦值(若是傳入nil,就等同於將這個類的類名設置爲nibName屬性)。當視圖控制對象須要載入視圖時,會載入和nibName匹配的XIB文件。若是應用是在iPad上運行的,就會先查找並載入後綴爲~ipad的XIB文件。
三、判斷設備類型:經過UIDevice類發送currentDevice方法,能夠獲得UIDevice對象,而後檢查該對象的userInterfaceIdiom屬性,該屬性只有兩種值:UIUserInterfaceIdiomPad 和 UIUserInterfaceIdiomPhone.
四、UIPopoverController對象可以在一個帶邊框的窗口中顯示另外一個視圖控制對象的視圖,方法是將「另外一個」視圖控制對象設置爲該對象的 contentViewController.(注意:在iPad中使用UIImagePickerController對象時,必須藉助UIPopoverController對象才能正確顯示),同時須要遵照UIPopoverControllerDelegate協議。
五、每一個視圖控制對象都有一個名爲 modalViewController 和一個名爲 parentViewController 的屬性,分別用於存儲模態顯示狀態下相應的子視圖和父視圖對象。
六、模態視圖控制對象的樣式:iPhone中的模態視圖控制對象會佔據整個窗口。對於iPhone,這是默認也是惟一的樣式選擇。對於iPad則有兩種額外的選項:表單樣式(form sheet)和頁單樣式(page sheet),可經過modalPresentationStyle屬性來設置,modalTransitionStyle能夠來設置過渡動畫。
一、應用沙盒(Application Sandbox):就是應用的文件系統目錄。應用沙盒包含如下幾個目錄:
二、獲取文件路徑:NSSearchPathForDirectoriesInDomains:返回NSArray對象,但在iPhone上只有一個Document目錄,因此直接取第一個就好了。還能夠經過NSHomeDirectory函數獲得應用程序根路徑,而後把Documents目錄拼到根路徑後面:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"],從而獲得全路徑。
三、 固化(archiving)是將單個或多個對象從內存寫入文件系統的過程。解固(unarchiving)則是從文件讀取對象並寫回內存。
只有遵照NSCoding協議的對象才能夠固化,固化的實際經過須要經過NSCoder實例來完成,NSCoder實例自己就是一個數據容器,能夠存放對象和對象的數據。
NSCoding協議兩個必須實現的方法:encodeWithCoder:(固化用)和initWithCoder:(解固用)。
NSKeyedArchiver的類方法archiveRootObject:toFile:能夠將遵照NSCoding協議的對象寫入文件,而且須要在encodeWithCoder:方法中再實現具體固化代碼(使用NSCoder的encodeObject:forKey:方法)。
NSKeyedUnarchiver的類方法unarchiveObjectWithFile:來解碼固化後的對象,而且須要在initWithCoder:方法中再實現具體解固代碼(使用NSCoder的decodeObjectForKey:)。
四、應用程序的幾種狀態:未運行、激活、未激活、後臺運行、掛起狀態(暫停).
五、在Object—C中,能夠經過NSData建立、維護和釋放內存緩衝區,保存必定數量的二進制數據,使用NSData的writeToFile:方法,能夠將轉化爲NSData類型的數據寫入到本地文件中去。使用NSFileManager的defaultManager實例的removeItemAtPath:方法來刪除文件。
UIImageJPEGRepresentation函數將會將一個UIImage對象壓縮並返回爲 NSData 對象。
一、 每一個應用都有一個 NSNotificationCenter 實例,經過defaultCenter消息得到。使用通知中心實例的 addObserver:selector:name:object:方法能夠將指定對象註冊爲觀察器,由通告觸發的方法會帶一個參數,該參數是一個NSNotification對象,有三個屬性:object,name,userInfo(NSDictionary對象)。
發送通告:[[NSNotificationCenter defaultCenter] postNotification: NSNotification實例];
通告中心不會保留觀察器,在通告中心註冊過的對象,必須在釋放前取消註冊。不然,當響應的通告再次出現時,通告中心仍然會向該觀察器發送消息,由於相應的對象已經釋放了,因此會致使應用崩潰。
二、UIDevice 對象會不間斷地發送通告。如下是UIDevice 對象所發通告的名稱常量。
UIDevice Orientation/BatteryState/BatteryLevel/ProximityState DidChangeNotification .
一、 要將數據保存在本地服務器中,可使用固化或者CoreData。固化最大的缺點是數據必須整存整取,要訪問固化文件中的任何數據,必須解固整個文件,要更新數據的任何變更,必須重寫整個文件。Core Data沒有這樣的缺點。弱國須要在文件系統和RAM之間傳送大量模型對象,那麼CoreData這種增量讀取、更新、刪除和插入的特性能夠大幅提升應用的性能。
Core Data框架提供的是對象關係映射(ORM)模型,即可以將Objective-C對象轉化爲數據,以保存在SQLLite數據庫文件中,也可將保存後的數據還原成Objective-C對象。
二、經過 CoreData 取回的對象,默認狀況下都是 NSManagedObject 實例。NSManagedObject是NSObject的子類,也是CoreData的重要組成部分,它相似於字典對象,能夠存取任意的鍵值對,即NSManagedObject對象會爲全部的實體屬性保存響應的鍵值對。
若是須要在建立 NSManagedObject 對象後作一些額外的工做,就應該覆蓋 awakeFromFetch 方法,而不是init方法,此外,該對象的 setPrimitiveValue:forKey: 方法能夠爲指定的屬性設置值。還有 awakeFromInsert 方法。
三、NSManagedObjectContext 對象:負責應用和數據庫之間的交互,經過 NSManagedObjectContext 對象的 NSPersistentStoreCoordinator 對象,能夠指定文件路徑並打開響應的 SQLite 數據庫。 而 NSPersistentStoreCoordinator 對象須要使用一個 NSManagedObjectModed 實例,這個實例表明某個 CoreData 模型文件。
要經過 NSManagedObjectContext 實例獲得這些對象,就必須設置並執行 NSFetchRequest 對象,而 NSFetchRequest 對象還須要一個實體描述對象 NSEntityDescription 來具體定義所要建立或取回的實體類型。
還能夠經過爲 NSFetchRequest 對象增長 NSPredicate 對象,返回符合指定條件的對象。此外,這個對象還能夠用於數組的過濾。
四、#pragma mark 經常使用來爲方法分組,編譯器會忽略這種標識,可是Xcode可以識別這種宏,它使方法的查看更加快速方便。
一、每一個應用都有一個 NSUserDefaults 實例。向 NSUserDefaults 類發送 standardUserDefaults 消息能夠獲得該實例,它相似於 NSMutableDictionary,能夠經過鍵存取或者刪除對象。當應用第一次使用 NSUserDefaults 實例時,會自動從文件讀取;修改數據後, NSUserDefaults 實例會自動將數據寫入文件。NSUserDefaults 的鍵必須是字符串類型,值必須是可序列化的對象。
二、偏好設置鍵的經常使用命名規定:應用名 + 偏好設置名 + 單詞prefKey
一、方向感應器經過跟蹤做用在其X,Y,Z軸上的重力,偵測設備所處的方向,經過方向感應器返回的數據,還能夠偵測設備運動速度的變化。
二、UIAccelerometer加速計是用來檢測iphone手機在x y z軸三個軸上加速度的共享API對象,UIAcceleration是表示加速度的類,它包含了來自加速計UIAccelerate的全部數據,有三個屬性值:x y z.iphone的加速計支持最高一每秒一百次的頻率進行輪詢。
三、要獲取方向感應器的數據,首先要獲得應用的 UIAccelerometer 實例(共享實例sharedAccelerometer),而後設置該對象的實例變量 updateInterval 和 delegate,即UIAccelerometerDelegate委託。相應的委託對象須要實現 accelerometer:didAccelerate: 方法,經過傳入 accelerometer:didAccelerate: 方法的 UIAccelerometer對象 和 UIAcceleration對象,該方法能夠根據updateInterval設置的時長,每隔一段時間報告方向感應器的數據變化。
四、要偵測用戶搖動設備的動做,須要在加速感應器傳出的信號上執行一些複雜的數學運算,不過UIResponder類所實現的方法能夠替咱們完成這些計算工做。motionBegan:withEvent: 和 motionEnded:withEvent: 和 motionCancelled:withEvent: 。
支持協議:
• 文件傳輸協議(ftp://)
• 超文本傳輸協議(http://)
• 安全128-bit超文本傳輸協議(https://)
• 本地文件路徑(file:///)
訪問URL步驟:
• 構造NSURL,,使用NSURL構造一個URL
• 生成一個NSURLRequest,使用NSURLRequest構造一個請求
• 經過NSURLConnection發送請求,使用NSURLConnection發送一個請求,並返回數
• 經過返回的NSURLResponse和NSError分析結果 ,使用NSURLResponse和NSError來監測響應和錯誤信息
一、 NSURL
一個典型的URL以下:
二、NSURLRequest:
封裝了一個針對某個URL的請求信息,能夠指明內容的緩存策略構造URL請求:
可修改的URL請求
• 若是須要在初始化後仍能對URL請求對象進行修改,可使用NSMutableURLRequest,能夠修改的項目包括:
• 緩存策略
• 超時時間
• URL對象
• 主文檔地址
• 頭信息
• 上行內容
• 請求方法
• Cookie
發送請求:
可使用同步或異步的方式發送一個請求,二者的結果 返回內容不一樣
三、NSURLConnection
同步請求:
• 最快捷的方式
• 不能監控內容下載過程
返回數據的處理
• 返回數據封裝以NSData
• 通常將其轉換爲NSString後,才進行處理
• NSString類中經常使用的轉換方法:
1) NSURLResponse
響應的處理:
2) NSError 錯誤的處理
UIWebView
• 內置的瀏覽器
• 能夠顯示HTML/XHTML內容,以及執行Javascript腳本 • 能夠控制瀏覽器的內容和訪問的URL
• 能夠執行前進/後退/刷新等動做
• 能夠經過委託監測URL的下載過程
UIWebView經常使用API
一、狀態欄
狀態欄通常高度爲20像素,在打手機或者顯示消息時會放大到40像素高,注意,兩倍高度的狀態欄在好像只能在縱向的模式下使用。
二、導航欄
在縱向模式下導航欄爲44像素高,在橫向模式下爲32像素高,導航欄提供了一個不多用的提示模式,該模式將高度擴展了30像素,在縱向模式下爲320*74像素,在橫向模式下爲480*74像素。
三、選項卡 工具欄
選項卡爲48像素高,工具欄爲44像素高。此兩個UI元素通長不用於橫向模式。
四、鍵盤和pickerView
此通常都爲橫向320*216像素,縱向爲480*162像素。
五、UIScreen類
[[UIScreen mainScreen] applicationFrame]通常會根據正在使用的工具欄,狀態欄,導航欄來返回可用的區域。
一、 在每一個頁面的入口和出口(通常是viewDidLoad和dealloc)打上日誌,能夠了解用戶的操做流程,並查出頁面在關閉時是否銷燬了相應的對象。
二、 定時器NSTimer 須要在一個新線程中運行,不然UI操做會阻塞定時器。
三、 須要爲定時器所在的線程設置NSRunLoop,不然定時器可能不會動。
四、 若是在線程中設置了NSRunLoop,須要在銷燬線程時也將其中止,使用CFRunLoopStop 。
五、 全部的UI操做都應該在主線程中執行,不然會致使應用崩潰(不必定是當即崩潰)。
六、 若是項目中有c函數,出現同名的函數會致使應用編譯失敗,即便這些c函數處於不一樣的頁面中。
七、 使用ASIHttpRequest,同步下載過程是不能被取消的,異步下載過程才能夠被取消。
八、 應用內支付,支付成功的回調裏面,還須要對加密數據transactionReceipt 進行驗證,避免越獄的機器使用 IAPFree 等軟件僞造數據。
九、 不要試圖獲取設備的UDID,不然會形成應用審覈不經過。可使用OpenUDID 或者 Mac 地址代替。
十、將比較費時的操做不要放在主線程中執行,避免UI響應慢。應該在一個新線程中執行(對有同步要求的操做除外)。
十一、使用最新的Xcode and iOS SDK進行開發,對高版本的兼容性會好一些。例如Mac 10.6下只能安裝Xcode4.2and iOS SDK 5.0 ,對iOS 5.1版本的系統就不能直接調試。
十二、 圖片命名:例若有一張圖片爲 MyImage.png,爲了兼容不一樣設備,須要存爲不一樣分辨率的圖片,命名規則以下:
MyImage.png - 默認的圖片名稱。
MyImage@2x.png - 適用於Retina 顯示屏的高分辨率圖片。
MyImage~iphone.png - 適用於iPhone 和 iPod touch的圖片。
MyImage@2x~iphone.png - 適用於iPhone and iPod touch 設備 Retina 顯示屏的高分辨率圖片。
在顯示圖片時,只須要直接取 @"MyImage.png",系統就能根據當前的設備,自動讀取相應的圖片了。
注意:以上圖片命名規則只使用於UIKit框架。若是使用了cocos2d等其餘框架,則有另一套命名規則。
1三、對於常見的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION,錯誤,通常都是由於訪問已經被release的對象形成的。尤爲是在一個線程中訪問另一個線程的autorelease庫中的對象,尤爲要注意此類問題。
1四、嚴格遵照iphone 內存管理手冊,對於不是由你建立的對象,不要越權release,不然,可能會致使程序crash.有時,一些看起來很是嚴重的bug,在通過N過次努力,多種思路嘗試fix以後,再回頭分析bug產生的緣由,你會發現,形成這個嚴重bug的緣由,極可能是你違反了一個衆所周知的規則引發的.這個規則你很是清楚,熟悉,但就是在coding的時候,稍不留神違反了它.因而就帶來了災難性後果.
1五、除了面向對象的cocoa外,iphone編程不要忘記非面向對象的Core Foundation。 面向對象庫裏不少沒有的功能,能夠嘗試在Core Foundation裏找找。披如:RSA算法,MD5算法,SHA1算法,AES加密算法等,cocoa對象庫裏並無相應的實現,但在core foundation裏,均有相應的實現。
1六、NSString類裏沒有的字符串編碼GBK,GB2312,GB18030等,在CoreFoundation裏,能找到相應的編碼。創建socket鏈接,得到輸入流和輸出流時,也須要使用Core Foundation裏的CFNetwork api。等等。
1七、經過設置NSZombieEnabled參數,有很是有效幫助解決內存釋放錯誤。
在消除某個對象時,若是爲該對象設置了delegate,則須要先將delegate設成nil,這是一種良好的代碼習慣。
1八、在3.0 的Simulator上使用Instruments 檢測內存泄漏時,沒法看到函數名,只能看到一些地址指針.在3.1,3.1.2,3.1.3的simulator都正常,可以正常地看到是在哪一個函數中存在的內存泄漏.經過Nib文件加載viewcontroller的各類UI控件時時,在viewDidLoad函數裏,viewController的控件才能使用。在viewcontroller的構造函數裏,nib裏的控件都尚未完成連接構造呢。
1九、iPhone程序崩潰不要着急。能夠結合使用Console和objc_exception_throw能夠快速定位根源所在。
一、 PDColoredProgressView進度條組件,能夠設置進度條的顏色,支持iOS4。可是在ASIHttpRequest的下載進度條中很差使用。
二、 MTLabel能夠對label中的文字設置行高。
三、 TSAlertView能夠在彈出框(UIAlertView)中設置輸入框,相似於JavaScript中的prompt 。
四、ZipArchive對文件進行壓縮和解壓操做。
五、 ASIHTTPRequest數據的上傳和下載,以及斷點續傳。
六、 json-framework文件格式解析。
一、 使用xcode自帶的 Instruments工具能夠查看應用的內存,cpu等資源使用狀況。
二、JSON格式解析速度優化。有人分析說 JSONKit 比 json-framework 效率更高。
日誌跟蹤
一、友盟,比較全面的數據分析工具。
二、 Crashlytics.framework能夠記錄應用程序崩潰日誌,並快速定位到出問題的代碼行。
若是使用過,你用它作了什麼?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?
Objecitve-C的重要特性是Runtime(運行時),在#import <objc/runtime.h> 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用
代碼交換兩個方法,在寫unit test時使用到。
UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。
若是使用過,請談談你使用CoreText或者CoreImage的體驗。
CoreText能夠解決複雜文字內容排版問題。CoreImage能夠處理圖片,爲其添加各類效果。體驗是很強大,挺複雜的。
NSNotification是通知模式在iOS的實現,KVO的全稱是鍵值觀察(Key-value observing),其是基於KVC(key-value coding)的,KVC是一個經過屬性名訪問屬性變量的機制。例如將Module層的變化,通知到多個Controller對象時,可使用NSNotification;若是是隻須要觀察某個對象的某個屬性,可使用KVO。
對於委託模式,在設計模式中是對象適配器模式,其是delegate是指向某個對象的,這是一對一的關係,而在通知模式中,每每是一對多的關係。委託模式,從技術上能夠如今改變delegate指向的對象,但不建議這樣作,會讓人迷惑,若是一個delegate對象不斷改變,指向不一樣的對象。
使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程併發數目。GCD和NSOperation均可以實現對線程的管理,區別是 NSOperation和NSOperationQueue是多線程的面向對象抽象。項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。
使用block是要注意,若將block作函數參數時,須要把它放到最後,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是可以讀取其餘函數內部變量的函數。
使用NSOperation發送異步網絡請求,使用NSOperationQueue管理線程數目及優先級,底層是用NSURLConnetion,詳細可見開源框架[LWConnetion](https://github.com/xunyn/LWConnetionDemo)。
最大的優勢是它的運行時特性,不足是沒有命名空間,對於命名衝突,可使用長命名法或特殊前綴解決,若是是引入的第三方庫之間的命名衝突,可使用link命令及flag解決衝突。
Core Data , Core Graphics, Core Animation,和OpenGLES框架 Foundation、UIKit
一個視圖控制只提供了一個View視圖,理論上一個 tableViewController也不能放吧, 只能說能夠嵌入一個tableview視圖。固然,題目自己也有歧義,若是不是咱們定性
思惟認爲的UIViewController, 而是宏觀的表示視圖控制者,那咱們卻是能夠把其當作一個視圖控制者,它能夠控制多個視圖控制器,好比TabbarController 那樣的感受。
首先咱們從代碼來看,數據源如何關聯上的,實際上是在數據源關聯的代理方法裏實現的。 所以咱們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據本身的須要去設置如相關的數據源。 所以,我以爲能夠設置多個數據源啊,可是有個問題是,你這是想幹嗎呢?想讓列表如何顯示,不一樣的數據源分區塊顯示?
UITableView經過重用單元格來達到節省內存的目的:經過爲每一個單元格指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出屏幕時,容許恢復單元格以便重用.對於不一樣種類的單元格使用不一樣的ID,對於簡單的表格,一個標識符就夠了. 假如一個TableView中有10個單元格,可是屏幕上最多能顯示4個,那麼實際上iPhone只是爲其分配了4個單元格的內存,沒有分配10個,當滾動單元格時,屏幕內顯示的單元格重複使用這4個內存
viewDidLoad:在視圖加載後被調用 viewWillAppear:視圖即將可見時調用。默認狀況下不執行任何操做
viewDidAppear: 視圖已徹底過渡到屏幕上時調用 viewWillDisappear:視圖被駁回時調用,覆蓋或以其餘方式隱藏。默認狀況下不執行任何操做 viewDidDisappear:視圖被駁回後調用,覆蓋或以其餘方式隱藏。默認狀況下不執行任何操做 先執行viewDidLoad再執行viewWillAppear。
常常咱們會用tableView顯示不少條目, 有時候須要顯示圖片, 可是一次從服務器上取來全部圖片對用戶來浪費流量, 對服務器也是負擔.最好是按需加載,即當該用戶要瀏覽該條目時再去加載它的圖片。 重寫以下方法
這雖然解決了延時加載的問題, 但當網速很慢, 或者圖片很大時(假設,雖然通常cell中的圖很小),你會發現程序可能會失去對用戶的響應.
緣由是
這個方法可能要花費大量的時間,主線程要處理這個method. 因此失去了對用戶的響應. 因此要將該方法提出來:
而後再新開一個線程去作這件事情
同理當咱們須要長時間的計算時,也要新開一個線程 去作這個計算以免程序處於假死狀態 以上代碼只是示例, 還能夠改進的更多, 好比從網上down下來一次後就將圖片緩存起來,再次顯示的時候就不用去下載。
Objective-c只支持單繼承,若是要實現多繼承的話,能夠經過類別和協議的方式來實現,cocoa 中全部的類都是NSObject 的子類,多繼承在這裏是用protocol 委託代理 來實現的。
Objective-C的對象在使用完成以後不會自動銷燬,須要執行dealloc來釋放空間(銷燬),不然內存泄露。誰建立,誰釋放(相似於「誰污染,誰治理」)。若是你經過alloc、new或copy來建立一個對象,那麼你必須調用release或autorelease。換句話說,不是你建立的,就不用你去釋放。
存放NSOperation的集合類。 操做和操做隊列,基本能夠當作java中的線程和線程池的概念。用於處理ios多線程開發的問題。 網上部分資料提到一點是,雖然是queue,可是卻並非帶有隊列的概念,放入的操做並不是是按照嚴格的先進現出。 這邊又有個疑點是,對於隊列來講,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的, 可是Bfunc是等Afunc徹底操做完之後,B纔開始啓動而且執行,所以隊列的概念離亂上有點違背了多線程處理這個概念。 可是轉念一想其實能夠參考銀行的取票和叫號系統。 所以對於A比B先排隊取票可是B率先執行完操做,咱們亦然能夠感性認爲這仍是一個隊列。 可是後來看到一票關於這操做隊列話題的文章,其中有一句提到 「由於兩個操做提交的時間間隔很近,線程池中的線程,誰先啓動是不定的。」 瞬間以爲這個queue名字有點忽悠人了,還不如pool~ 綜合一點,咱們知道他能夠比較大的用處在於能夠幫組多線程編程就行了。
1七、asihttp代碼原理,異步請求的原理,異步請求最大數目,爲何只能這麼多?
ASIHTTPRequest是一個簡易使用的類庫,經過包裝CFNetwork API 來簡化 和服務器端的通信. 它編寫的語言是Objective-C 可以應用於Mac OS X and iPhone 平臺的應用程序. 異步: 請求經過事件觸發->服務器處理(這是瀏覽器仍然能夠做其餘事情)->處理完畢 這個數量是跟cpu有關的,併發性取決於cpu核數,每一個核只能同時處理一個任務.4核cpu理論上能夠併發處理4個任務,若是按http來算就是4個請求,可是cpu是搶佔式資源,因此通常來講併發量是要根據任務的耗時和cpu的繁忙度來計算4個左右只是個經驗值你開10個短耗時的任務和幾個長耗時任務的效率是不一樣的。
懶漢模式,只在用到的時候纔去初始化。 也能夠理解成延時加載。 我以爲最好也最簡單的一個列子就是tableView中圖片的加載顯示了。 一個延時載,避免內存太高,一個異步加載,避免線程堵塞。
iOS中能夠有四種持久化數據的方式: 屬性列表、對象歸檔、SQLite3和Core Data;core data可使你以圖形界面的方式快速的定義app的數據模型,同時在你的代碼中容易獲取到它。core data提供了基礎結構去處理經常使用的功能,例如保存,恢復,撤銷和重作,容許你在app中繼續建立新的任務。在使用core data的時候,你不用安裝額外的數據庫系統,由於core data使用內置的sqlite數據庫。core data將你app的模型層放入到一組定義在內存中的數據對象。core data會追蹤這些對象的改變,同時能夠根據須要作相反的改變,例如用戶執行撤銷命令。當core data在對你app數據的改變進行保存的時候,core data會把這些數據歸檔,並永久性保存。 mac os x中sqlite庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌入到應用程序。能夠在多個平臺使用,sqlite是一個輕量級的嵌入式sql數據庫編程。與core data框架不一樣的是,sqlite是使用程序式的,sql的主要的API來直接操做數據表。
第 一階段:BeejiveIM服務器把要發送的消息、目的iPhone的標識打包,發 給APNS。
第二階段:APNS在自身的已註冊Push服務 的iPhone列表中,查找有相應標識的iPhone,並把消息發到iPhone。
第三階段:iPhone把發來的消息傳遞給相應的應用程序, 而且按照設定彈出Push通知。