iOS開發--- 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/O
        Bonjour和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)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安裝的目標目錄。

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   提供使用內置音頻單元服務,音頻處理模塊

        ② 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等。

2、委託機制與Core location
委託機制是Cocoa Touch的一種設計模式,Core location框架則是提供IOS內建的位置定位功能。
3、預處理
編譯源代碼分爲兩個步驟:預處理和編譯。
4、MapKit框架
主要類:MKMapView(顯示地圖、以及地圖相關操作)
5、XIB文件所有者
新創建的空XIB文件只有兩個對象:文件所有者和第一響應對象。作用是爲CurrentTimeViewController創建視圖。
6、UIView
 UIView子類都會實現drawRect:方法,其中包含和繪製視圖有關的代碼。每次繪製UIView實例時,系統會爲視圖專門準備一個繪圖上下文( CGContextRef context = UIGraphicsGetCurrentContext() )。
接着系統會激活該上下文,然後向需要回執的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 plaincopy在CODE上查看代碼片派生到我的代碼片
  1. UIImagePickerControllerSourceTypeCamera:用戶將拍攝一張新照片。  
  2. UIImagePickerControllerSourceTypePhotoLibrary:顯示界面,讓用戶選擇相冊,然後從該相冊選擇一張照片。  
  3. UIImagePickerControllerSourceTypeSavedPhotosAlbum:讓用戶從最近拍攝的照片裏選擇一張照片。  
  4. 選中照片時會觸發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 plaincopy在CODE上查看代碼片派生到我的代碼片
  1. * 應用程序包(application bundle):包含所有的資源文件和可執行文件,並且是隻讀目錄。  
  2. * Library/Preferences/:存放所有的偏好設置,通過NSUserDefaults類來存取,iTunes會在同步設備是備份該目錄。  
  3. * tmp/:用於保存應用運行時所需的臨時數據,通過函數NSTemporaryDirectory可以得到應用沙盒下tmp目錄的全路徑。  
  4. * Documents/:保存應用運行時生成的需要保留的數據,iTunes同步設備室會備份該目錄。  
  5. * 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 plaincopy在CODE上查看代碼片派生到我的代碼片
  1. http://lily:[email protected]/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page  
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. URL組成1:  
  2. absoluteString: http://lily:[email protected] ... =f&oq=&aqi=g10#page   
  3. absoluteURL: http://lily:[email protected] ... =f&oq=&aqi=g10#page  
  4. baseURL - 如果在構造URL對象時沒有指定,則爲nil  
  5. fragment: page  
  6. host: www.google.com  
  7. URL組成2:  
  8. port: 80,如果沒有指定,則爲nil  
  9. path: /search  
  10. query: hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10  
  11. relativePath: /search  
  12. relativeString: http://lily:[email protected]:80/search? hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page  
  13. URL組成3:  
  14. user: lily  
  15. password: 123456   
  16. scheme: http  
  17. 如何構造一個url  
  18. • + (id)URLWithString:(NSString *)URLString  
  19. • + (id)URLWithString:(NSString *)URLString relativeToURL: (NSURL *)baseURL  
  20. • + (id)fileURLWithPath:(NSString *)path isDirectory: (BOOL)isDir  
  21. • + (id)fileURLWithPath:(NSString *)path  
  22. ----------------------------------------------------------  
  23. • - (id)initWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)path  
  24. • - (id)initWithString:(NSString *)URLString  
  25. • - (id)initWithString:(NSString *)URLString relativeToURL:(NSURL *)baseURL  
  26. • - (id)initFileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir  
  27. • - (id)initFileURLWithPath:(NSString *)path  
2、NSURLRequest:
 
封裝了一個針對某個URL的請求信息,可以指明內容的緩存策略構造URL請求:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. • + (id)requestWithURL:(NSURL *)theURL  
  2. • + (id)requestWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval  
  3. • - (id)initWithURL:(NSURL *)theURL  
  4. • - (id)initWithURL:(NSURL *)theURL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInter val)timeoutInterval  
  5. 支持的緩存策略:  
  6. NSURLRequestUseProtocolCachePolicy   
  7. NSURLRequestReloadIgnoringLocalCacheData   
  8. NSURLRequestReloadIgnoringLocalAndRemoteCacheData   
  9. NSURLRequestReloadIgnoringCacheData   
  10. NSURLRequestReturnCacheDataElseLoad   
  11. NSURLRequestReturnCacheDataDontLoad   
  12. NSURLRequestReloadRevalidatingCacheData  
可修改的URL請求
• 如果需要在初始化後仍能對URL請求對象進行修改,可以使用NSMutableURLRequest,可以修改的項目包括:
• 緩存策略
• 超時時間
• URL對象
• 主文檔地址
• 頭信息
• 上行內容 
• 請求方法
• Cookie
 
發送請求:
可以使用同步或異步的方式發送一個請求,兩者的結果 返回內容不同


3、NSURLConnection

 同步請求:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. • + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error  
• 最快捷的方式
• 不能監控內容下載過程
 
返回數據的處理
• 返回數據封裝以NSData
• 一般將其轉換爲NSString後,才進行處理 
• NSString類中常用的轉換方法:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. • - (id)initWithData:(NSData *)data encoding: (NSStringEncoding)encoding  


1) NSURLResponse

響應的處理:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. • NSURLRequest對應的響應的元信息封裝在NSURLResponse中   
  2. • - (long long)expectedContentLength   
  3. • - (NSString *)suggestedFilename  
  4. • - (NSString *)MIMEType  
  5. • - (NSString *)textEncodingName   
  6. • - (NSURL *)URL  


2) NSError  錯誤的處理

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. • 如果請求過程中發生錯誤,導致請求無法完成,則 error對象不爲nil  
  2. • - (NSString *)localizedDescription  
  3. 異步請求  
  4. • 不影響當前正在進行操作   
  5. • 數據分多次按順序返回  
  6. 異步請求步驟:  
  7. • 構造連接對象(NSURLConnection)  
  8. • 發送請求  
  9. • 使用委託監控數據返回過程  
  10. • 將多次返回的數據連接成同一個數據對象  
  11. • 使用連接後的數據對象  
  12. 構造連接  
  13. • + (NSURLConnection *)connectionWithRequest: (NSURLRequest *)request delegate:(id)delegate  
  14. • - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate  
  15. • - (id)initWithRequest:(NSURLRequest *)request delegate: (id)delegate startImmediately:(BOOL)startImmediately  
  16. 發送請求  
  17. • - (void)start  
  18. • - (void)cancel  
  19.    
  20. 使用委託  
  21. • - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
  22. • - (void)connectionDidFinishLoading:(NSURLConnection *)connection  
  23. • - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  

UIWebView
• 內置的瀏覽器
• 可以顯示HTML/XHTML內容,以及執行Javascript腳本 • 可以控制瀏覽器的內容和訪問的URL
• 可以執行前進/後退/刷新等動作
• 可以通過委託監測URL的下載過程
UIWebView常用API
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. • - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL  
  2. • - (void)loadRequest:(NSURLRequest *)request  
  3. • - (void)reload  
  4. • BOOL detectsPhoneNumbers  
  5. • 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,否則會造成應用審覈不通過。可以使用OpenUDID 或者 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 - 默認的圖片名稱。
[email protected] - 適用於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程序崩潰不要着急。可以結合使用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 <objc/runtime.h> 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用  
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. ```objective-c  
  2. Method method1 = class_getInstanceMethod(cls, sel1);  
  3. Method method2 = class_getInstanceMethod(cls, sel2);  
  4. method_exchangeImplementations(method1, method2);    
  5. ```     
代碼交換兩個方法,在寫unit test時使用到。  
2、CG框架的聯繫是什麼?分別用CA和CG做過些什麼動畫或者圖像上的內容。(有需要的話還可以涉及Quartz的一些內容)  
UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。    
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. UIKit |   
  2. ------------ |   
  3. Core Animation |   
  4. Core Graphics |  
  5. 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](https://github.com/xunyn/LWConnetionDemo)。  

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 plaincopy在CODE上查看代碼片派生到我的代碼片
  1. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath     
  2.       
  3.     UIImage *image = [self getImageForCellAtIndexPath:indexPath];  //從網上取得圖片     
  4.    [cell.imageView setImage:image];     
  5. }    

這雖然解決了延時加載的問題, 但當網速很慢, 或者圖片很大時(假設,雖然一般cell中的圖很小),你會發現程序可能會失去對用戶的響應. 
原因是  
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. UIImage *image = [self getImageForCellAtIndexPath:indexPath];      

這個方法可能要花費大量的時間,主線程要處理這個method. 所以失去了對用戶的響應. 所以要將該方法提出來:  
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. - (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath     
  2. {      
  3.    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];     
  4.     UIImage *image = [self getImageForCellAtIndexPath:indexPath];      
  5.     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];      
  6.     [cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image wai tUntilDone:NO];     
  7.     [pool release];     
  8. }     

然後再新開一個線程去做這件事情  
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath     
  2. {      
  3.    [NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget: self withObject:indexPath];     
  4. }    
同理當我們需要長時間的計算時,也要新開一個線程 去做這個計算以避免程序處於假死狀態  以上代碼只是示例, 還可以改進的更多, 比如從網上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通知。


轉自:http://blog.csdn.net/banketree/article/details/39928441

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章