iOS 理解
1、簡介
IOS是由蘋果公司為iPhone、iPod touch和iPad等設備開發的操作系統。
2、知識點
1、IOS系統
iPhone OS(現在叫iOS)是iPhone, iPod touch 和 iPad 設備的操作系統。
1、Core OS:
它是用FreeBSD和Mach所改寫的Darwin, 是開源、符合POSIX標準的一個Unix核心。這一層包含或者說是提供了整個iPhone OS的一些基礎功能,比如:硬件驅動, 內存管理,程序管理,線程管理(POSIX),文件系統,網絡(BSD Socket),以及標準輸入輸出等等,所有這些功能都會通過C語言的API來提供。另外,值得一題的是,這一層最具有UNIX色彩,如果你需要把 UNIX上所開發的程序移植到iPhone上,多半都會使用到Core OS的API.核心OS層的驅動也提供了硬件和系統框架之間的接口。然而,由于安全的考慮,只有有限的系統框架類能訪問內核和驅動。iPhone OS提供了許多訪問操作系統低層功能的接口集,iPhone 應用通過LibSystem庫來訪問這些功能,這些接口集如下所示:線程(POSIX線程)網絡(BSD sockets)文件系統訪問標準I/OBonjour和DNS服務現場信息(Locale Information)內存分配數學計算許多Core OS技術的頭文件位于目錄<iPhoneSDK>/usr/include/,iPhoneSDK是SDK的安裝目錄。2、Core Services:
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)CFNetworkCFNetwork框架(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)SQLiteiPhone應用中可以嵌入一個小型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安裝的目標目錄。3、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 提供使用內置音頻單元服務,音頻處理模塊
2、委托機制與Core location
委托機制是Cocoa Touch的一種設計模式,Core location框架則是提供IOS內建的位置定位功能。
3、預處理
編譯源代碼分為兩個步驟:預處理和編譯。
4、MapKit框架
主要類:MKMapView(顯示地圖、以及地圖相關操作)
5、XIB文件所有者
新創建的空XIB文件只有兩個對象:文件所有者和第一響應對象。作用是為CurrentTimeViewController創建視圖。
6、UIView
接著系統會激活該上下文,然后向需要回執的UIView對象發送drawRect:消息。
注意:只能在drawRect:方法中調用繪圖方法或函數。
除了drawRect:方法,無法從其他地方獲得激活狀態的CGContextRef.也就無法調用灰土方法或函數。
7、UIScrollView
為了讓用戶能夠滾動視圖,可以將視圖設置為UIScrollView的子視圖,主要涉及它的setContentSize方法。
要實現縮放功能,則需要為UIScrollView設置委托對象UIScrollViewDelegate協議并使用setMinimumZoomScale,setMaximumZoomScale方法來啟用縮放功能,且要實現viewForZoomingInScrollView:(該方法返回UIScrollView對象需要縮放的視圖)。
8、隱藏狀態條
[UIApplication shareApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]
9、UITabBarController
負責視圖的交換工作,使用時可能涉及到的方法是setViewControllers:,給該方法傳入每個Tab對應的ViewController數組。(每個視圖控制對象都有一個類型為UITabBarItem的實例變量,負責標簽條上顯示的文字和圖標)。
10、UIWindow
實現了一個名為setRootViewController:的方法,將UIViewController實例作為參數傳入該方法,傳入的視圖控制對象的視圖會自動加入該窗口,成為窗口的子視圖并調整大小和窗口保持一致。窗口對象也會保留它的根視圖對象。
11、載入XIB文件
創建UIViewController子類實例時,通過指定初始化方法 initWithNibName:bundle: 傳入XIB的文件名。當視圖控制對象需要使用實例變量view的時候,會查看應用程序包內是否存在相應名稱的XIB文件(如果傳入的名稱是nil,那么UIViewController對象會查找和這個UIViewController子類的類名匹配的XIB文件)。
12、UIVIewController
視圖控制對象也是通過alloc和init創建的,但是視圖控制對象只有在真正需要視圖是,才會通過調用loadView來創建,這種做法能夠提高內存使用效率。
注意:
1、在UIViewController里面使用了timer,會使得controller被retain,因此在viewdisapper時應將timer置為nil,否則controller的dealloc不會被執行。
2、如果在UIViewController里面使用ASIHttprequest發送了async請求,并且將request的delegate設置為controller,若請求沒回來時就銷毀了controller,會使得request的delegate變為野指針,解決方案是:銷毀controller時,調用request的cancel來取消請求,或者將request的delegate設置為nil。另外一種應對delegate變為野指針的方法是,假設delegate的類是A ,若object_getClass(delegate) != [A class] 說明是野指針了,此時就不能對delegate調用函數了。
13、UITableView UITableViewController UITableViewCell對象
1、使用UITableView時必須要指定它的數據源,該數據源必須遵守 UITableViewDataSource 協議 ,同時也要為 UItableView 對象設置 UITableViewDelegate 委托, UITableViewController 可以作為 UITableView的數據源、視圖控制對象和委托對象。
2、幾個關于UITableVIewController的重要方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; //返回table中section的個數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section //返回每個Section的行數
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath //具體行
3、UITableViewCell是UIView的子類。UITableViewCell對象也有自己的子視圖:contentView,真正負責顯示UITableViewCell的是contentView下的另外三個子視圖,分別是:textLabel detailTextLabel imageView. UITableViewCell還有一個UITableViewCellStyle屬性,用于決定使用那些子視圖以及這些子視圖在contentView中的位置。
4、重用UITableViewCell對象,由于IOS設備內存有限,所以必須采用重用UITableViewCell對象的機制。即當用戶滾動表格是,部分UITableViewCell對象會移出窗口,我們把移出的UITableViewCell對象放入UITableViewCell對象池,等待重用。每個UITableViewCell對象都有一個 reuseIdentifier 屬性,類型為NSString,通過想表格視圖傳入特定的NSString對象,數據源就可以查詢并獲取一個可重用的UITableViewCell對象。如下列代碼是獲取可重用對象:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”UITableViewCell”];
5、UITableView對象有一個editing屬性,設置為YES時,UITableView對象就會進入編輯模式。
14、UINavigationController 導航控制器
1、UITabBarController對象可以切換沒有相互依存關系的情況的視圖,并且必須在初始化時設置好所有的視圖控制對象,但如果屏幕鍵互有關聯,就要使用導航控制對象。
2、使用 UINavigationController顯示多個屏幕的信息時,他會以棧的形式保存所有的屏幕,這里的棧其實是NSArray對象,通過發送viewController消息可以得到整個棧(返回一個NSArray對象),也可以使用push和pop兩種方法的推入和推出視圖。
3、UIViewController對象有一個navigationItem屬性,類型為UINavigationItem.和UINavigationBar不同,UINavigationItem不是UIView的子類,不能在屏幕上顯示,但 UINavigationItem 能夠為 UINavigationBar對象提供繪圖所需的內容。當某個UIViewController對象成為UINavigationController的棧頂對象時,UINavigationBar對象會使用UIViewController對象的navigationItem并設置相應的屬性。UINavigationItem可以包含leftBarButtonItem rightBarButtonItem titleView三個可以自定義的部分。
4、SEL的數據類型是指針,指向選擇器(selector)。選擇器是方法的唯一標識。將方法名傳給 @selector() 指令,可以得到指向相應方法的SEL(@selector不會檢查相應的方法是否存在)。
5、UIView實例存在一個endEditing:消息,當視圖收到該消息時,如果視圖是當前的第一相應對象,就會取消自己的第一響應對象狀態,而且虛擬鍵盤也會消失(傳入的參數代表是否需要強制取消第一響應對象狀態,YES代表強制退出), textField也可以通過resignFirstResponder來取消第一響應狀態。
15、相機
1、UIImageView對象會根據contentMode屬性顯示圖片,該屬性決定圖片在frame中的顯示位置和縮放模式,默認值是UIViewContentModeCenter(即根據UIImageView對象的bounds居中顯示圖片,沒有縮放),此外還有屬性UIViewContentModeScaleToFill/AspectFit/AspectFill等.
2、UIToolbar對象和UINavigationBar類似,區別是UINavigationBar只能有兩個UIBarButtonItem對象,而UIToolbar可以有一組UIBarButtonItem對象。
3、啟用相機拍照功能需要用到UIImagePickerController實例,并且必須設定其實例屬性sourceType并設置委托對象(UIImagePickerControllerDelegate),此外,由于UIImagePickerController是UINavigationController的子類,所以也需要遵守UINavigationControllerDelegate協議。
sourceType有三種 :
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
UIImagePickerControllerSourceTypeCamera:用戶將拍攝一張新照片。
UIImagePickerControllerSourceTypePhotoLibrary:顯示界面,讓用戶選擇相冊,然后從該相冊選擇一張照片。
UIImagePickerControllerSourceTypeSavedPhotosAlbum:讓用戶從最近拍攝的照片里選擇一張照片。
選中照片時會觸發UIImagePickerControllerDelegate下的imagePickerController:didFinishPickingMediaWithInfo:消息,通過該消息可以獲取選擇的圖片對象(UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage])。
4、在彈出照片選擇的視圖的時候,我們會用到當前視圖控制器的presentModalViewController:animated:方法以模態的形式顯示視圖,關閉時也需要用到dismissModalViewControllerAnimated:方法。
5、 類型為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);
6、取消點擊textField出現的鍵盤:[textField resignFirstResponder]; //取消第一響應對象狀態
16、UIPopoverController(針對iPad)與模態視圖控制對象
1、前面了解到,現在有四種顯示視圖控制對象的方法:
設置UIWindow實例的跟視圖控制對象、壓入UINavigationController棧,加入UITabBarController對象和以模態形式顯示。
2、UIViewController對象會在運行時自動根據當前的設備載入不同的XIB文件。UIViewController對象擁有一個nibName屬性,創建該對象時,需要通過初始化方法為這個nibName屬性賦值(如果傳入nil,就等同于將這個類的類名設置為nibName屬性)。當視圖控制對象需要載入視圖時,會載入和nibName匹配的XIB文件。如果應用是在iPad上運行的,就會先查找并載入后綴為~ipad的XIB文件。
3、判斷設備類型:通過UIDevice類發送currentDevice方法,可以得到UIDevice對象,然后檢查該對象的userInterfaceIdiom屬性,該屬性只有兩種值:UIUserInterfaceIdiomPad 和 UIUserInterfaceIdiomPhone.
4、UIPopoverController對象能夠在一個帶邊框的窗口中顯示另一個視圖控制對象的視圖,方法是將“另一個”視圖控制對象設置為該對象的 contentViewController.(注意:在iPad中使用UIImagePickerController對象時,必須借助UIPopoverController對象才能正確顯示),同時需要遵守UIPopoverControllerDelegate協議。
5、每個視圖控制對象都有一個名為 modalViewController 和一個名為 parentViewController 的屬性,分別用于存儲模態顯示狀態下相應的子視圖和父視圖對象。
6、模態視圖控制對象的樣式:iPhone中的模態視圖控制對象會占據整個窗口。對于iPhone,這是默認也是唯一的樣式選擇。對于iPad則有兩種額外的選項:表單樣式(form sheet)和頁單樣式(page sheet),可通過modalPresentationStyle屬性來設置,modalTransitionStyle可以來設置過渡動畫。
17、保存、讀取與多任務處理
1、應用沙盒(Application Sandbox):就是應用的文件系統目錄。應用沙盒包含以下幾個目錄:
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
* 應用程序包(application bundle):包含所有的資源文件和可執行文件,并且是只讀目錄。
* Library/Preferences/:存放所有的偏好設置,通過NSUserDefaults類來存取,iTunes會在同步設備是備份該目錄。
* tmp/:用于保存應用運行時所需的臨時數據,通過函數NSTemporaryDirectory可以得到應用沙盒下tmp目錄的全路徑。
* Documents/:保存應用運行時生成的需要保留的數據,iTunes同步設備室會備份該目錄。
* Libraty/Caches/:保存應用運行是生成的需要保留的數據,iTunes不會在同步設備是備份該目錄。
2、獲取文件路徑:NSSearchPathForDirectoriesInDomains:返回NSArray對象,但在iPhone上只有一個Document目錄,所以直接取第一個就行了。還可以通過NSHomeDirectory函數得到應用程序根路徑,然后把Documents目錄拼到根路徑后面:[NSHomeDirectory() stringByAppendingPathComponent:@”Documents”],從而得到全路徑。
3、 固化(archiving)是將單個或多個對象從內存寫入文件系統的過程。解固(unarchiving)則是從文件讀取對象并寫回內存。
只有遵守NSCoding協議的對象才可以固化,固化的實際通過需要通過NSCoder實例來完成,NSCoder實例本身就是一個數據容器,可以存放對象和對象的數據。
NSCoding協議兩個必須實現的方法:encodeWithCoder:(固化用)和initWithCoder:(解固用)。
NSKeyedArchiver的類方法archiveRootObject:toFile:可以將遵守NSCoding協議的對象寫入文件,并且需要在encodeWithCoder:方法中再實現具體固化代碼(使用NSCoder的encodeObject:forKey:方法)。
NSKeyedUnarchiver的類方法unarchiveObjectWithFile:來解碼固化后的對象,并且需要在initWithCoder:方法中再實現具體解固代碼(使用NSCoder的decodeObjectForKey:)。
4、應用程序的幾種狀態:未運行、激活、未激活、后臺運行、掛起狀態(暫停).
5、在Object—C中,可以通過NSData創建、維護和釋放內存緩沖區,保存一定數量的二進制數據,使用NSData的writeToFile:方法,可以將轉化為NSData類型的數據寫入到本地文件中去。使用NSFileManager的defaultManager實例的removeItemAtPath:方法來刪除文件。
UIImageJPEGRepresentation函數將會將一個UIImage對象壓縮并返回為 NSData 對象。
18、通告機制與設備轉動
1、 每個應用都有一個 NSNotificationCenter 實例,通過defaultCenter消息獲得。使用通知中心實例的 addObserver:selector:name:object:方法可以將指定對象注冊為觀察器,由通告觸發的方法會帶一個參數,該參數是一個NSNotification對象,有三個屬性:object,name,userInfo(NSDictionary對象)。
發送通告:[[NSNotificationCenter defaultCenter] postNotification: NSNotification實例];
通告中心不會保留觀察器,在通告中心注冊過的對象,必須在釋放前取消注冊。否則,當響應的通告再次出現時,通告中心仍然會向該觀察器發送消息,因為相應的對象已經釋放了,所以會導致應用崩潰。
2、UIDevice 對象會不間斷地發送通告。以下是UIDevice 對象所發通告的名稱常量。
UIDevice Orientation/BatteryState/BatteryLevel/ProximityState DidChangeNotification .
19、Core Data
1、 要將數據保存在本地服務器中,可以使用固化或者CoreData。固化最大的缺點是數據必須整存整取,要訪問固化文件中的任何數據,必須解固整個文件,要更新數據的任何變動,必須重寫整個文件。Core Data沒有這樣的缺點。弱國需要在文件系統和RAM之間傳送大量模型對象,那么CoreData這種增量讀取、更新、刪除和插入的特性可以大幅提高應用的性能。
Core Data框架提供的是對象關系映射(ORM)模型,即能夠將Objective-C對象轉化為數據,以保存在SQLLite數據庫文件中,也可將保存后的數據還原成Objective-C對象。
2、通過 CoreData 取回的對象,默認情況下都是 NSManagedObject 實例。NSManagedObject是NSObject的子類,也是CoreData的重要組成部分,它類似于字典對象,可以存取任意的鍵值對,即NSManagedObject對象會為所有的實體屬性保存響應的鍵值對。
如果需要在創建 NSManagedObject 對象后做一些額外的工作,就應該覆蓋 awakeFromFetch 方法,而不是init方法,此外,該對象的 setPrimitiveValue:forKey: 方法可以為指定的屬性設置值。還有 awakeFromInsert 方法。
3、NSManagedObjectContext 對象:負責應用和數據庫之間的交互,通過 NSManagedObjectContext 對象的 NSPersistentStoreCoordinator 對象,可以指定文件路徑并打開響應的 SQLite 數據庫。 而 NSPersistentStoreCoordinator 對象需要使用一個 NSManagedObjectModed 實例,這個實例代表某個 CoreData 模型文件。
要通過 NSManagedObjectContext 實例得到這些對象,就必須設置并執行 NSFetchRequest 對象,而 NSFetchRequest 對象還需要一個實體描述對象 NSEntityDescription 來具體定義所要創建或取回的實體類型。
還可以通過為 NSFetchRequest 對象增加 NSPredicate 對象,返回符合指定條件的對象。此外,這個對象還可以用于數組的過濾。
4、#pragma mark 常用來為方法分組,編譯器會忽略這種標識,但是Xcode能夠識別這種宏,它使方法的查看更加快速方便。
20、NSUserDefaults
1、每個應用都有一個 NSUserDefaults 實例。向 NSUserDefaults 類發送 standardUserDefaults 消息可以得到該實例,它類似于 NSMutableDictionary,可以通過鍵存取或者刪除對象。當應用第一次使用 NSUserDefaults 實例時,會自動從文件讀取;修改數據后, NSUserDefaults 實例會自動將數據寫入文件。NSUserDefaults 的鍵必須是字符串類型,值必須是可序列化的對象。
2、偏好設置鍵的常用命名規定:應用名 + 偏好設置名 + 單詞prefKey
21、方向感應器
1、方向感應器通過跟蹤作用在其X,Y,Z軸上的重力,偵測設備所處的方向,通過方向感應器返回的數據,還可以偵測設備運動速度的變化。
2、UIAccelerometer加速計是用來檢測iphone手機在x y z軸三個軸上加速度的共享API對象,UIAcceleration是表示加速度的類,它包含了來自加速計UIAccelerate的所有數據,有三個屬性值:x y z.iphone的加速計支持最高一每秒一百次的頻率進行輪詢。
3、要獲取方向感應器的數據,首先要得到應用的 UIAccelerometer 實例(共享實例sharedAccelerometer),然后設置該對象的實例變量 updateInterval 和 delegate,即UIAccelerometerDelegate委托。相應的委托對象需要實現 accelerometer:didAccelerate: 方法,通過傳入 accelerometer:didAccelerate: 方法的 UIAccelerometer對象 和 UIAcceleration對象,該方法可以根據updateInterval設置的時長,每隔一段時間報告方向感應器的數據變化。
4、要偵測用戶搖動設備的動作,需要在加速感應器傳出的信號上執行一些復雜的數學運算,不過UIResponder類所實現的方法可以替我們完成這些計算工作。motionBegan:withEvent: 和 motionEnded:withEvent: 和 motionCancelled:withEvent: 。
22、 iOS網絡編程
支持協議:
? 文件傳輸協議(ftp://)
? 超文本傳輸協議(http://)
? 安全128-bit超文本傳輸協議(https://)
? 本地文件路徑(file:///)
訪問URL步驟:
? 構造NSURL,,使用NSURL構造一個URL
? 生成一個NSURLRequest,使用NSURLRequest構造一個請求
? 通過NSURLConnection發送請求,使用NSURLConnection發送一個請求,并返回數
? 通過返回的NSURLResponse和NSError分析結果 ,使用NSURLResponse和NSError來監測響應和錯誤信息
1、 NSURL
一個典型的URL如下:
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
http://lily:123456@www.google.com/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
URL組成1:
absoluteString: http://lily:123456@www.google.co … =f&oq=&aqi=g10#page
absoluteURL: http://lily:123456@www.google.co … =f&oq=&aqi=g10#page
baseURL - 如果在構造URL對象時沒有指定,則為nil
fragment: page
host: www.google.com
URL組成2:
port: 80,如果沒有指定,則為nil
path: /search
query: hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10
relativePath: /search
relativeString: http://lily:123456@www.google.com:80/search? hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
URL組成3:
user: lily
password: 123456
scheme: http
如何構造一個url
? + (id)URLWithString:(NSString *)URLString
? + (id)URLWithString:(NSString )URLString relativeToURL: (NSURL )baseURL
? + (id)fileURLWithPath:(NSString *)path isDirectory: (BOOL)isDir
? + (id)fileURLWithPath:(NSString *)path
? - (id)initWithScheme:(NSString )scheme host:(NSString )host path:(NSString *)path
? - (id)initWithString:(NSString *)URLString
? - (id)initWithString:(NSString )URLString relativeToURL:(NSURL )baseURL
? - (id)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir
? - (id)initFileURLWithPath:(NSString *)path
2、NSURLRequest:
封裝了一個針對某個URL的請求信息,可以指明內容的緩存策略構造URL請求:
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
? + (id)requestWithURL:(NSURL *)theURL
? + (id)requestWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval
? - (id)initWithURL:(NSURL *)theURL
? - (id)initWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval
支持的緩存策略:
NSURLRequestUseProtocolCachePolicy
NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
NSURLRequestReloadIgnoringCacheData
NSURLRequestReturnCacheDataElseLoad
NSURLRequestReturnCacheDataDontLoad
NSURLRequestReloadRevalidatingCacheData
可修改的URL請求
? 如果需要在初始化后仍能對URL請求對象進行修改,可以使用NSMutableURLRequest,可以修改的項目包括:
? 緩存策略
? 超時時間
? URL對象
? 主文檔地址
? 頭信息
? 上行內容
? 請求方法
? Cookie
發送請求:
可以使用同步或異步的方式發送一個請求,兩者的結果 返回內容不同
3、NSURLConnection
同步請求:
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
? + (NSData )sendSynchronousRequest:(NSURLRequest )request returningResponse:(NSURLResponse )response error:(NSError )error
? 最快捷的方式
? 不能監控內容下載過程
返回數據的處理
? 返回數據封裝以NSData
? 一般將其轉換為NSString后,才進行處理
? NSString類中常用的轉換方法:
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
? - (id)initWithData:(NSData *)data encoding: (NSStringEncoding)encoding
1) NSURLResponse
響應的處理:
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
? NSURLRequest對應的響應的元信息封裝在NSURLResponse中
? - (long long)expectedContentLength
? - (NSString *)suggestedFilename
? - (NSString *)MIMEType
? - (NSString *)textEncodingName
? - (NSURL *)URL
2) NSError 錯誤的處理
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
? 如果請求過程中發生錯誤,導致請求無法完成,則 error對象不為nil
? - (NSString *)localizedDescription
異步請求
? 不影響當前正在進行操作
? 數據分多次按順序返回
異步請求步驟:
? 構造連接對象(NSURLConnection)
? 發送請求
? 使用委托監控數據返回過程
? 將多次返回的數據連接成同一個數據對象
? 使用連接后的數據對象
構造連接
? + (NSURLConnection )connectionWithRequest: (NSURLRequest )request delegate:(id)delegate
? - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate
? - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate startImmediately:(BOOL)startImmediately
發送請求
? - (void)start
? - (void)cancel
使用委托
? - (void)connection:(NSURLConnection )connection didReceiveData:(NSData )data
? - (void)connectionDidFinishLoading:(NSURLConnection *)connection
? - (void)connection:(NSURLConnection )connection didFailWithError:(NSError )error
UIWebView
? 內置的瀏覽器
? 可以顯示HTML/XHTML內容,以及執行Javascript腳本 ? 可以控制瀏覽器的內容和訪問的URL
? 可以執行前進/后退/刷新等動作
? 可以通過委托監測URL的下載過程
UIWebView常用API
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
? - (void)loadHTMLString:(NSString )string baseURL:(NSURL )baseURL
? - (void)loadRequest:(NSURLRequest *)request
? - (void)reload
? BOOL detectsPhoneNumbers
? BOOL scalesPageToFit
23、控件默認高度
1、狀態欄
狀態欄一般高度為20像素,在打手機或者顯示消息時會放大到40像素高,注意,兩倍高度的狀態欄在好像只能在縱向的模式下使用。
2、導航欄
在縱向模式下導航欄為44像素高,在橫向模式下為32像素高,導航欄提供了一個很少用的提示模式,該模式將高度擴展了30像素,在縱向模式下為320*74像素,在橫向模式下為480*74像素。
3、選項卡 工具欄
選項卡為48像素高,工具欄為44像素高。此兩個UI元素通長不用于橫向模式。
4、鍵盤和pickerView
此一般都為橫向320*216像素,縱向為480*162像素。
5、UIScreen類
[[UIScreen mainScreen] applicationFrame]一般會根據正在使用的工具欄,狀態欄,導航欄來返回可用的區域。
開發經驗
1、 在每個頁面的入口和出口(一般是viewDidLoad和dealloc)打上日志,可以了解用戶的操作流程,并查出頁面在關閉時是否銷毀了相應的對象。
2、 定時器NSTimer 需要在一個新線程中運行,否則UI操作會阻塞定時器。
3、 需要為定時器所在的線程設置NSRunLoop,否則定時器可能不會動。
4、 如果在線程中設置了NSRunLoop,需要在銷毀線程時也將其停止,使用CFRunLoopStop 。
5、 所有的UI操作都應該在主線程中執行,否則會導致應用崩潰(不一定是立即崩潰)。
6、 如果項目中有c函數,出現同名的函數會導致應用編譯失敗,即使這些c函數處于不同的頁面中。
7、 使用ASIHttpRequest,同步下載過程是不能被取消的,異步下載過程才可以被取消。
8、 應用內支付,支付成功的回調里面,還需要對加密數據transactionReceipt 進行驗證,避免越獄的機器使用 IAPFree 等軟件偽造數據。
9、 不要試圖獲取設備的UDID,否則會造成應用審核不通過??梢允褂肙penUDID 或者 Mac 地址代替。
10、將比較費時的操作不要放在主線程中執行,避免UI響應慢。應該在一個新線程中執行(對有同步要求的操作除外)。
11、使用最新的Xcode and iOS SDK進行開發,對高版本的兼容性會好一些。例如Mac 10.6下只能安裝Xcode4.2and iOS SDK 5.0 ,對iOS 5.1版本的系統就不能直接調試。
12、 圖片命名:例如有一張圖片為 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等其他框架,則有另外一套命名規則。
13、對于常見的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION,錯誤,一般都是因為訪問已經被release的對象造成的。尤其是在一個線程中訪問另外一個線程的autorelease庫中的對象,尤其要注意此類問題。
14、嚴格遵守iphone 內存管理手冊,對于不是由你創建的對象,不要越權release,否則,可能會導致程序crash.有時,一些看起來非常嚴重的bug,在經過N過次努力,多種思路嘗試fix之后,再回頭分析bug產生的原因,你會發現,造成這個嚴重bug的原因,很可能是你違反了一個眾所周知的規則引起的.這個規則你非常清楚,熟悉,但就是在coding的時候,稍不留神違反了它.于是就帶來了災難性后果.
15、除了面向對象的cocoa外,iphone編程不要忘記非面向對象的Core Foundation。 面向對象庫里很多沒有的功能,可以嘗試在Core Foundation里找找。披如:RSA算法,MD5算法,SHA1算法,AES加密算法等,cocoa對象庫里并沒有相應的實現,但在core foundation里,均有相應的實現。
16、NSString類里沒有的字符串編碼GBK,GB2312,GB18030等,在CoreFoundation里,能找到相應的編碼。建立socket連接,獲得輸入流和輸出流時,也需要使用Core Foundation里的CFNetwork api。等等。
17、通過設置NSZombieEnabled參數,有非常有效幫助解決內存釋放錯誤。
在消除某個對象時,如果為該對象設置了delegate,則需要先將delegate設成nil,這是一種良好的代碼習慣。
18、在3.0 的Simulator上使用Instruments 檢測內存泄漏時,無法看到函數名,只能看到一些地址指針.在3.1,3.1.2,3.1.3的simulator都正常,能夠正常地看到是在哪個函數中存在的內存泄漏.通過Nib文件加載viewcontroller的各種UI控件時時,在viewDidLoad函數里,viewController的控件才能使用。在viewcontroller的構造函數里,nib里的控件都還沒有完成鏈接構造呢。
19、iPhone程序崩潰不要著急??梢越Y合使用Console和objc_exception_throw可以快速定位根源所在。
一些好用的框架/組件:
1、 PDColoredProgressView進度條組件,可以設置進度條的顏色,支持iOS4。但是在ASIHttpRequest的下載進度條中不好使用。
2、 MTLabel可以對label中的文字設置行高。
3、 TSAlertView可以在彈出框(UIAlertView)中設置輸入框,類似于JavaScript中的prompt 。
4、ZipArchive對文件進行壓縮和解壓操作。
5、 ASIHTTPRequest數據的上傳和下載,以及斷點續傳。
6、 json-framework文件格式解析。
性能優化
1、 使用xcode自帶的 Instruments工具可以查看應用的內存,cpu等資源使用情況。
2、JSON格式解析速度優化。有人分析說 JSONKit 比 json-framework 效率更高。
日志跟蹤
1、友盟,比較全面的數據分析工具。
2、 Crashlytics.framework可以記錄應用程序崩潰日志,并快速定位到出問題的代碼行。
相關面試總結
1、你使用過Objective-C的運行時編程(Runtime Programming)么?
如果使用過,你用它做了什么?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?
Objecitve-C的重要特性是Runtime(運行時),在#import
Method method1 = class_getInstanceMethod(cls, sel1); Method method2 = class_getInstanceMethod(cls, sel2); method_exchangeImplementations(method1, method2);代碼交換兩個方法,在寫unit test時使用到。
2、CG框架的聯系是什么?分別用CA和CG做過些什么動畫或者圖像上的內容。(有需要的話還可以涉及Quartz的一些內容)
UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
| Core Animation |
| Core Graphics |
| Graphics Hardware |
3、是否使用過CoreText或者CoreImage等?
如果使用過,請談談你使用CoreText或者CoreImage的體驗。
CoreText可以解決復雜文字內容排版問題。CoreImage可以處理圖片,為其添加各種效果。體驗是很強大,挺復雜的。
4、 NSNotification和KVO的區別和用法是什么?什么時候應該使用通知,什么時候應該使用KVO,它們的實現上有什么區別嗎?如果用protocol和delegate(或者delegate的Array)來實現類似的功能可能嗎?如果可能,會有什么潛在的問題?如果不能,為什么?(雖然protocol和delegate這種東西面試已經面爛了…)
NSNotification是通知模式在iOS的實現,KVO的全稱是鍵值觀察(Key-value observing),其是基于KVC(key-value coding)的,KVC是一個通過屬性名訪問屬性變量的機制。例如將Module層的變化,通知到多個Controller對象時,可以使用NSNotification;如果是只需要觀察某個對象的某個屬性,可以使用KVO。
對于委托模式,在設計模式中是對象適配器模式,其是delegate是指向某個對象的,這是一對一的關系,而在通知模式中,往往是一對多的關系。委托模式,從技術上可以現在改變delegate指向的對象,但不建議這樣做,會讓人迷惑,如果一個delegate對象不斷改變,指向不同的對象。
5、 你用過NSOperationQueue么?如果用過或者了解的話,你為什么要使用NSOperationQueue,實現了什么?請描述它和GCD的區別和類似的地方(提示:可以從兩者的實現機制和適用范圍來描述)。
使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程并發數目。GCD和NSOperation都可以實現對線程的管理,區別是 NSOperation和NSOperationQueue是多線程的面向對象抽象。項目中使用NSOperation的優點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具有面向對象的優點(復用、封裝),使得實現是多線程支持,而接口簡單,建議在復雜項目中使用。
項目中使用GCD的優點是GCD本身非常簡單、易用,對于不復雜的多線程操作,會節省代碼量,而Block參數的使用,會是代碼更為易讀,建議在簡單項目中使用。
6、既然提到GCD,那么問一下在使用GCD以及block時要注意些什么?它們兩是一回事兒么?block在ARC中和傳統的MRC中的行為和用法有沒有什么區別,需要注意些什么?
使用block是要注意,若將block做函數參數時,需要把它放到最后,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是能夠讀取其他函數內部變量的函數。
7、您是否做過異步的網絡處理和通訊方面的工作?如果有,能具體介紹一些實現策略么?
使用NSOperation發送異步網絡請求,使用NSOperationQueue管理線程數目及優先級,底層是用NSURLConnetion,詳細可見開源框架LWConnetion。
8、對于Objective-C,你認為它最大的優點和最大的不足是什么?對于不足之處,現在有沒有可用的方法繞過這些不足來實現需求。如果可以的話,你有沒有考慮或者實踐過重新實現OC的一些功能,如果有,具體會如何做?
最大的優點是它的運行時特性,不足是沒有命名空間,對于命名沖突,可以使用長命名法或特殊前綴解決,如果是引入的第三方庫之間的命名沖突,可以使用link命令及flag解決沖突。
9、簡單描述開發中使用的框架?
Core Data , Core Graphics, Core Animation,和OpenGLES框架 Foundation、UIKit
10、是否可以在一個視圖控制器中嵌入兩個tableview控制器?
一個視圖控制只提供了一個View視圖,理論上一個 tableViewController也不能放吧, 只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性
思維認為的UIViewController, 而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController 那樣的感覺。
11、一個tableView是否可以關聯兩個不同的數據源?你會怎么處理?
首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法里實現的。 因此我們并不關心如何去關聯他,他怎么關聯上,方法只是讓我返回根據自己的需要去設置如相關的數據源。 因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示?
12、tableView的重用機制?
UITableView通過重用單元格來達到節省內存的目的:通過為每個單元格指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出屏幕時,允許恢復單元格以便重用.對于不同種類的單元格使用不同的ID,對于簡單的表格,一個標識符就夠了. 假如一個TableView中有10個單元格,但是屏幕上最多能顯示4個,那么實際上iPhone只是為其分配了4個單元格的內存,沒有分配10個,當滾動單元格時,屏幕內顯示的單元格重復使用這4個內存
13、 viewcontroller的一些方法的說明viewDidLoad, viewWillDisappear, viewWillAppear方法的 順序和 作用?
viewDidLoad:在視圖加載后被調用 viewWillAppear:視圖即將可見時調用。默認情況下不執行任何操作
viewDidAppear: 視圖已完全過渡到屏幕上時調用 viewWillDisappear:視圖被駁回時調用,覆蓋或以其他方式隱藏。默認情況下不執行任何操作 viewDidDisappear:視圖被駁回后調用,覆蓋或以其他方式隱藏。默認情況下不執行任何操作 先執行viewDidLoad再執行viewWillAppear。
14、如何實現延遲加載圖片?以及加載圖片出現的超時問題?
經常我們會用tableView顯示很多條目, 有時候需要顯示圖片, 但是一次從服務器上取來所有圖片對用戶來浪費流量, 對服務器也是負擔.最好是按需加載,即當該用戶要瀏覽該條目時再去加載它的圖片。 重寫如下方法
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
- (void)tableView:(UITableView )tableView willDisplayCell:(UITableViewCell )cell forRow AtIndexPath:(NSIndexPath *)indexPath
[cell.imageView setImage:image];
}
這雖然解決了延時加載的問題, 但當網速很慢, 或者圖片很大時(假設,雖然一般cell中的圖很小),你會發現程序可能會失去對用戶的響應.
原因是
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
UIImage *image = [self getImageForCellAtIndexPath:indexPath];
這個方法可能要花費大量的時間,主線程要處理這個method. 所以失去了對用戶的響應. 所以要將該方法提出來:
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
- (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [self getImageForCellAtIndexPath:indexPath];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image wai tUntilDone:NO];
[pool release];
}
然后再新開一個線程去做這件事情
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
- (void)tableView:(UITableView )tableView willDisplayCell:(UITableViewCell )cell forRow AtIndexPath:(NSIndexPath *)indexPath
{
[NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget: self withObject:indexPath];
}
同理當我們需要長時間的計算時,也要新開一個線程 去做這個計算以避免程序處于假死狀態 以上代碼只是示例, 還可以改進的更多, 比如從網上down下來一次后就將圖片緩存起來,再次顯示的時候就不用去下載。
14、Object-c的類可以多重繼承么?可以實現多個接口么?重寫一個類的方式用繼承好還是分類好?為什么?
Objective-c只支持單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,cocoa 中所有的類都是NSObject 的子類,多繼承在這里是用protocol 委托代理 來實現的。
15、簡單描述一下ios的內存管理機制?有沒有垃圾回收機制?與java有什么區別?
Objective-C的對象在使用完成之后不會自動銷毀,需要執行dealloc來釋放空間(銷毀),否則內存泄露。誰創建,誰釋放(類似于“誰污染,誰治理”)。如果你通過alloc、new或copy來創建一個對象,那么你必須調用release或autorelease。換句話說,不是你創建的,就不用你去釋放。
16、 簡單描述一下多線程,以及如何處理ios多線程開發?什么情況下會使用多線程?優點?
存放NSOperation的集合類。 操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發的問題。 網上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進現出。 這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的, 但是Bfunc是等Afunc完全操作完以后,B才開始啟動并且執行,因此隊列的概念離亂上有點違背了多線程處理這個概念。 但是轉念一想其實可以參考銀行的取票和叫號系統。 因此對于A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。 但是后來看到一票關于這操作隊列話題的文章,其中有一句提到 “因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。” 瞬間覺得這個queue名字有點忽悠人了,還不如pool~ 綜合一點,我們知道他可以比較大的用處在于可以幫組多線程編程就好了。
17、asihttp代碼原理,異步請求的原理,異步請求最大數目,為什么只能這么多?
ASIHTTPRequest是一個簡易使用的類庫,通過包裝CFNetwork API 來簡化 和服務器端的通訊. 它編寫的語言是Objective-C 能夠應用于Mac OS X and iPhone 平臺的應用程序. 異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢 這個數量是跟cpu有關的,并發性取決于cpu核數,每個核只能同時處理一個任務.4核cpu理論上可以并發處理4個任務,如果按http來算就是4個請求,但是cpu是搶占式資源,所以一般來說并發量是要根據任務的耗時和cpu的繁忙度來計算4個左右只是個經驗值你開10個短耗時的任務和幾個長耗時任務的效率是不同的。
18、 什么是懶漢模式(懶加載)?什么時候使用?好處是什么?
懶漢模式,只在用到的時候才去初始化。 也可以理解成延時加載。 我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。 一個延時載,避免內存過高,一個異步加載,避免線程堵塞。
19、ios平臺怎么做數據的持久化?coredata和sqlited 的聯系?coredata是一個關系型數據庫嗎?
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來直接操作數據表。
20、什么是PUSH(推送消息)? 在什么情況下使用,使用過哪些推送?百度云推送?
第 一階段:BeejiveIM服務器把要發送的消息、目的iPhone的標識打包,發 給APNS。
第二階段:APNS在自身的已注冊Push服務 的iPhone列表中,查找有相應標識的iPhone,并把消息發到iPhone。
第三階段:iPhone把發來的消息傳遞給相應的應用程序, 并且按照設定彈出Push通知。
頂
4
踩
0
上一篇Objective-C 淺析
下一篇編程之路
我的同類文章
IOS(2)
?視頻直播 解決方案2016-05-17閱讀1319
?Objective-C 淺析2014-10-08閱讀2541
參考知識庫
猜你在找
基于Webrtc的跨平臺實時語音通信解決方案從零練就iOS高手實戰班iOS8開發技術(Swift版):音頻和視頻老郭全套iOS開發課程【UI技術】軟件測試基礎
在iOS設備上進行抓包補充iOS筆記爬蟲技術做到哪些很酷很有趣很有用的事情2013 CocoaChina微信精選之技術匯2013 CocoaChina微信精選之技術匯
查看評論
1樓 何必汰認真 2014-10-18 14:43發表 [回復]
沙發…
您還沒有登錄,請[登錄]或[注冊]
* 以上用戶言論只代表其個人觀點,不代表CSDN網站的觀點或立場
核心技術類目
全部主題 Hadoop AWS 移動游戲 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10 Eclipse CRM JavaScript 數據庫 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云計算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大數據 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap
個人資料
訪問我的空間
半棵樹
3 3
訪問:975311次
積分:10679
等級:
排名:第949名
原創:140篇轉載:3篇譯文:0篇評論:802條
文章搜索
博客專欄
Android Raknet 通訊
文章:5篇
閱讀:16319
移動平臺
文章:33篇
閱讀:194855
文章分類
MFC(11)
android(91)
逆向(3)
VC++(26)
外掛(1)
linux(5)
vmware(1)
java(3)
夢想(1)
IOS(3)
通訊、游戲引擎(7)
php(0)
文章存檔
2016年05月(1)
2015年01月(4)
2014年12月(5)
2014年11月(4)
2014年10月(5)
展開
評論排行
JAVA上百實例源碼以及開源項目(86)
Android 雙卡雙待識別(62)
開源項目之Android http請求及緩存框架(GalHttprequest)(51)
c/c++成長之捷徑(50)
CSipsimple的封裝(49)
Sipdroid的封裝(45)
Android 上百實例源碼分析以及開源分析(40)
Android 設計模式(29)
Android 面試有感(28)
編程之路(25)
推薦文章
*Android RocooFix 熱修復框架
* android6.0源碼分析之Camera API2.0下的初始化流程分析
*Android_GestureDetector手勢滑動使用
*Android MaterialList源碼解析
*Android開源框架Universal-Image-Loader基本介紹及使用
*Android官方開發文檔Training系列課程中文版:創建自定義View之View的創建
公司簡介|招賢納士|廣告服務|銀行匯款帳號|聯系方式|版權聲明|法律顧問|問題報告|合作伙伴|論壇反饋
網站客服雜志客服微博客服webmaster@csdn.net400-600-2320|北京創新樂知信息技術有限公司 版權所有|江蘇樂知網絡技術有限公司 提供商務支持
京 ICP 證 09002463 號|Copyright ? 1999-2014, CSDN.NET, All Rights Reserved GongshangLogo
總結
- 上一篇: pyspark mysql rdd_Py
- 下一篇: 共享分区