IOS計劃 分析

一、基本介紹
IOS蘋果公司iPhone、iPod touch和iPad操做系統和其餘設備的發展。

二、知識點
一、IOS系統

 iPhone OS(如今所謂的iOS)這是iPhone, iPod touch 和 iPad 設備的操做系統。java

一、Core OS:mysql

它是用FreeBSD和Mach所改寫的Darwin, 是開源、符合POSIX標準的一個Unix核心。這一層包括或者說是提供了整個iPhone OS的一些基礎功能,比方:硬件驅動, 內存管理。程序管理,線程管理(POSIX)。文件系統,網絡(BSD Socket),以及標準輸入輸出等等。所有這些功能都會經過C語言的API來提供。ios

另外,值得一題的是,這一層最具備UNIX色彩,假設你需要把 UNIX上所開發的程序移植到iPhone上,多半都會使用到Core OS的API.git

        核心OS層的驅動也提供了硬件和系統框架之間的接口。然而,因爲安全的考慮,僅僅有有限的系統框架類能訪問內核和驅動。github


        iPhone OS提供了不少訪問操做系統低層功能的接口集,iPhone 應用經過LibSystem庫來訪問這些功能,這些接口集例如如下所看到的:
        線程(POSIX線程)
        網絡(BSD sockets)
        文件系統訪問
        標準I/O
        Bonjour和DNS服務
        現場信息(Locale Information)
        內存分配
        數學計算
       不少Core OS技術的頭文件位於文件夾<iPhoneSDK>/usr/include/,iPhoneSDK是SDK的安裝文件夾。面試

二、Core Services:objective-c

    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)提供了保存在手機設備中的電話本編程接口。sql

開發人員能使用該框架訪問和改動存儲在用戶聯繫 人數據庫裏的記錄。數據庫

好比,一個聊天程序可以使用該框架得到可能的聯繫人列表。啓動聊天的進程(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和HTTPserver的通訊,或解析DNS等任務。

使用CFNetwork框架實現的任務例如如下所看到的:
          BSD Sockets;
          利用SSL或TLS建立加密鏈接。
          解析DNS Hosts;
          解析HTTP協議,鑑別HTTP和HTTPSserver;
          在FTPserver工做;
          公佈、解析和瀏覽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,而不需要在遠端運行還有一個數據庫server。

開發人員可以建立本地數據庫文件。並管理這些 文件裏的表格和記錄。

數據庫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語言的。它採用基於對象的抽象表徵基礎繪圖對象,使得圖像內easy於保存和複用。
        ② 核心動畫(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等。

二、託付機制與Core location
託付機制是Cocoa Touch的一種設計模式,Core location框架則是提供IOS內建的位置定位功能。


三、預處理
編譯源碼分爲兩個步驟:預處理和編譯。
四、MapKit框架
主要類:MKMapView(顯示地圖、以及地圖相關操做)
五、XIB文件所有者
新建立的空XIB文件僅僅有兩個對象:文件所有者和第一響應對象。做用是爲CurrentTimeViewController建立視圖。
六、UIView
  UIView子類都會實現drawRect:方法,當中包括和繪製視圖有關的代碼。每次繪製UIView實例時,系統會爲視圖專門準備一個繪圖上下文( CGContextRef context = UIGraphicsGetCurrentContext() )。


接着系統會激活該上下文,而後向需要回執的UIView對象發送drawRect:消息。


注意:僅僅能在drawRect:方法中調用繪圖方法或函數。


除了drawRect:方法,沒法從其它地方得到激活狀態的CGContextRef.也就沒法調用灰土方法或函數。


七、UIScrollView
爲了讓用戶可以滾動視圖,可以將視圖設置爲UIScrollView的子視圖,主要涉及它的setContentSize方法。


要實現縮放功能。則需要爲UIScrollView設置託付對象UIScrollViewDelegate協議並使用setMinimumZoomScale,setMaximumZoomScale方法來啓用縮放功能,且要實現viewForZoomingInScrollView:(該方法返回UIScrollView對象需要縮放的視圖)。

八、隱藏狀態條
[UIApplication shareApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]
九、UITabBarController
負責視圖的交換工做,使用時可能涉及到的方法是setViewControllers:,給該方法傳入每個Tab對應的ViewController數組。(每個視圖控制對象都有一個類型爲UITabBarItem的實例變量。負責標籤條上顯示的文字和圖標)。
十、UIWindow
實現了一個名爲setRootViewController:的方法,將UIViewController實例做爲參數傳入該方法,傳入的視圖控制對象的視圖會本身主動加入該窗體。成爲窗體的子視圖並調整大小和窗體保持一致。窗體對象也會保留它的根視圖對象。
十一、載入XIB文件

建立UIViewController子類實例時,經過指定初始化方法 initWithNibName:bundle: 傳入XIB的文件名稱。當視圖控制對象需要使用實例變量view的時候,會查看應用程序包內是否存在對應名稱的XIB文件(假設傳入的名稱是nil,那麼UIViewController對象會查找和這個UIViewController子類的類名匹配的XIB文件)。

十二、UIVIewController
視圖控制對象也是經過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調用函數了。


1三、UITableView  UITableViewController  UITableViewCell對象 
一、使用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對象就會進入編輯模式。

1四、UINavigationController 導航控制器
一、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來取消第一響應狀態。


1五、相機
一、UIImageView對象會依據contentMode屬性顯示圖片。該屬性決定圖片在frame中的顯示位置和縮放模式。默認值是UIViewContentModeCenter(即依據UIImageView對象的bounds居中顯示圖片。沒有縮放),此外還有屬性UIViewContentModeScaleToFill/AspectFit/AspectFill等.


二、UIToolbar對象和UINavigationBar類似,差異是UINavigationBar僅僅能有兩個UIBarButtonItem對象。而UIToolbar可以有一組UIBarButtonItem對象。


三、啓用相機拍照功能需要用到UIImagePickerController實例。並且必須設定事實上例屬性sourceType並設置託付對象(UIImagePickerControllerDelegate),此外。因爲UIImagePickerController是UINavigationController的子類,因此也需要遵照UINavigationControllerDelegate協議。

sourceType有三種 :
UIImagePickerControllerSourceTypeCamera:用戶將拍攝一張新照片。
UIImagePickerControllerSourceTypePhotoLibrary:顯示界面,讓用戶選擇相冊,而後從該相冊選擇一張照片。

UIImagePickerControllerSourceTypeSavedPhotosAlbum:讓用戶從近期拍攝的照片裏選擇一張照片。 選中照片時會觸發UIImagePickerControllerDelegate下的imagePickerController:didFinishPickingMediaWithInfo:消息,經過該消息可以獲取選擇的圖片對象(UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage])。


四、在彈出照片選擇的視圖的時候,咱們會用到當前視圖控制器的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]; //取消第一響應對象狀態

1六、UIPopoverController(針對iPad)與模態視圖控制對象
一、前面瞭解到,現在有四種顯示視圖控制對象的方法:
設置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可以來設置過渡動畫。

1七、保存、讀取與多任務處理
一、應用沙盒(Application Sandbox):就是應用的文件系統文件夾。

應用沙盒包括如下幾個文件夾:

* 應用程序包(application bundle):包括所有的資源文件和可運行文件,並且是僅僅讀文件夾。
* Library/Preferences/:存放所有的偏好設置。經過NSUserDefaults類來存取,iTunes會在同步設備是備份該文件夾。
* tmp/:用於保存應用運行時所需的暫時數據。經過函數NSTemporaryDirectory可以獲得應用沙盒下tmp文件夾的全路徑。

* Documents/:保存應用運行時生成的需要保留的數據。iTunes同步設備室會備份該文件夾。 * Libraty/Caches/:保存應用運行是生成的需要保留的數據,iTunes不會在同步設備是備份該文件夾。


二、獲取文件路徑: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 對象。

1八、通告機制與設備轉動
一、 每個應用都有一個 NSNotificationCenter 實例,經過defaultCenter消息得到。

使用通知中心實例的 addObserver:selector:name:object:方法可以將指定對象註冊爲觀察器,由通告觸發的方法會帶一個參數。該參數是一個NSNotification對象,有三個屬性:object。name。userInfo(NSDictionary對象)。


 發送通告:[[NSNotificationCenter defaultCenter] postNotification: NSNotification實例]。
通告中心不會保留觀察器。在通告中心註冊過的對象,必須在釋放前取消註冊。

不然,當響應的通告再次出現時。通告中心仍然會向該觀察器發送消息,因爲對應的對象已經釋放了。因此會致使應用崩潰。



二、UIDevice 對象會不間斷地發送通告。如下是UIDevice 對象所發通告的名稱常量。

UIDevice Orientation/BatteryState/BatteryLevel/ProximityState DidChangeNotification .
1九、Core Data
一、 要將數據保存在本地server中,可以使用固化或者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可以識別這樣的宏。它使方法的查看更加高速方便。


20、NSUserDefaults
一、每個應用都有一個 NSUserDefaults 實例。向 NSUserDefaults 類發送 standardUserDefaults 消息可以獲得該實例,它類似於 NSMutableDictionary。可以經過鍵存取或者刪除對象。當應用第一次使用 NSUserDefaults 實例時,會本身主動從文件讀取。改動數據後。 NSUserDefaults 實例會本身主動將數據寫入文件。NSUserDefaults 的鍵必須是字符串類型,值必須是可序列化的對象。


二、偏好設置鍵的常用命名規定:應用名 + 偏好設置名 + 單詞prefKey

2一、方向感應器

一、方向感應器經過跟蹤做用在其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: 。

2二、 iOS網絡編程
支持協議:   
• 文件傳輸協議(ftp://)
• 超文本傳輸協議(http://)
• 安全128-bit超文本傳輸協議(https://)
• 本地文件路徑(file:///)
訪問URL步驟:
• 構造NSURL,,使用NSURL構造一個URL
• 生成一個NSURLRequest,使用NSURLRequest構造一個請求
• 經過NSURLConnection發送請求。使用NSURLConnection發送一個請求,並返回數
• 經過返回的NSURLResponse和NSError分析結果 ,使用NSURLResponse和NSError來監測響應和錯誤信息
一、 NSURL
一個典型的URL例如如下:
http://lily:123456@www.google.com/search?

hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page

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

二、NSURLRequest:
 
封裝了一個針對某個URL的請求信息,可以指明內容的緩存策略構造URL請求:
• + (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
 
發送請求:
可以使用同步或異步的方式發送一個請求,二者的結果 返回內容不一樣


三、NSURLConnection

 同步請求:
• + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
• 最快捷的方式
• 不能監控內容下載過程
 
返回數據的處理
• 返回數據封裝以NSData
• 通常將其轉換爲NSString後,才進行處理 
• NSString類中常用的轉換方法:
• - (id)initWithData:(NSData *)data encoding: (NSStringEncoding)encoding


1) NSURLResponse

響應的處理:
• NSURLRequest對應的響應的元信息封裝在NSURLResponse中 
• - (long long)expectedContentLength 
• - (NSString *)suggestedFilename
• - (NSString *)MIMEType
• - (NSString *)textEncodingName 
• - (NSURL *)URL


2) NSError  錯誤的處理

• 假設請求過程當中錯誤發生,致使請求沒法完畢,則 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
• - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL
• - (void)loadRequest:(NSURLRequest *)request
• - (void)reload
• BOOL detectsPhoneNumbers
• BOOL scalesPageToFit
2三、控件默認高度
一、狀態欄
狀態欄通常高度爲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可以記錄應用程序崩潰日誌。並高速定位到出問題的代碼行。



相關面試總結
一、你使用過Objective-C的運行時編程(Runtime Programming)麼?

假設使用過,你用它作了什麼?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?  

Objecitve-C的重要特性是Runtime(運行時),在#import <objc/runtime.h> 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用  
```objective-c
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);  
```   
代碼交換兩個方法,在寫unit test時使用到。

 

二、CG框架的聯繫是什麼?分別用CA和CG作過些什麼動畫或者圖像上的內容。

(有需要的話還可以涉及Quartz的一些內容)  

UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。

   

UIKit | 
------------ | 
Core Animation | 
Core Graphics |
Graphics Hardware|    
三、是否使用過CoreText或者CoreImage等?

假設使用過,請談談你使用CoreText或者CoreImage的體驗。

CoreText可以解決複雜文字內容排版問題。CoreImage可以處理圖片,爲其加入各類效果。

體驗是很是強大,挺複雜的。

四、 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對象不斷改變,指向不一樣的對象。

 

五、 你用過NSOperationQueue麼?假設用過或者瞭解的話,你爲何要使用NSOperationQueue。實現了什麼?請描寫敘述它和GCD的差異和類似的地方(提示:可以從二者的實現機制和適用範圍來描寫敘述)。
使用NSOperationQueue用來管理子類化的NSOperation對象。控制其線程併發數目。GCD和NSOperation都可以實現對線程的管理,差異是 NSOperation和NSOperationQueue是多線程的面向對象抽象。

項目中使用NSOperation的長處是NSOperation是對線程的高度抽象,在項目中使用它。會使項目的程序結構更好,子類化NSOperation的設計思路。是具備面向對象的長處(複用、封裝)。使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。


項目中使用GCD的長處是GCD自己很是簡單、易用。對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。

六、既然提到GCD,那麼問一下在使用GCD以及block時要注意些什麼?它們兩是一回事兒麼?block在ARC中和傳統的MRC中的行爲和使用方法有沒有什麼差異,需要注意些什麼?

使用block是要注意,若將block作函數參數時,需要把它放到最後,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是可以讀取其它函數內部變量的函數。

七、您是否作過異步的網絡處理和通信方面的工做?假設有,能詳細介紹一些實現策略麼?

使用NSOperation發送異步網絡請求,使用NSOperationQueue管理線程數目及優先級。底層是用NSURLConnetion,詳細可見開源框架[LWConnetion](https://github.com/xunyn/LWConnetionDemo)。

 

八、對於Objective-C,你以爲它最大的長處和最大的不足是什麼?對於不足之處。現在有沒有可用的方法繞過這些不足來實現需求。

假設可以的話。你有沒有考慮或者實踐過又一次實現OC的一些功能,假設有,詳細會怎樣作?

最大的長處是它的運行時特性,不足是沒有命名空間。對於命名衝突,可以使用長命名法或特殊前綴解決。假設是引入的第三方庫之間的命名衝突,可以使用link命令及flag解決衝突。  
九、簡單描寫敘述開發中使用的框架? 

 Core Data , Core Graphics, Core Animation,和OpenGLES框架 Foundation、UIKit   

十、可否夠在一個視圖控制器中嵌入兩個tableview控制器? 

一個視圖控制僅僅提供了一個View視圖,理論上一個  tableViewController也不能放吧, 僅僅能說可以嵌入一個tableview視圖。

固然,題目自己也有歧義,假設不是咱們定性

思惟以爲的UIViewController。 而是宏觀的表示視圖控制者。那咱們卻是可以把其當作一個視圖控制者,它可以控制多個視圖控制器,比方TabbarController 那樣的感受。   
十一、一個tableView可否夠關聯兩個不一樣的數據源?你會怎麼處理?  

首先咱們從代碼來看,數據源怎樣關聯上的,事實上是在數據源關聯的代理方法裏實現的。 所以咱們並不關心怎樣去關聯他,他怎麼關聯上。方法僅僅是讓我返回依據本身的需要去設置如相關的數據源。

所以。我以爲可以設置多個數據源啊,但是有個問題是,你這是想幹嗎呢?想讓列表怎樣顯示。不一樣的數據源分區塊顯示?  

十二、tableView的重用機制?  

UITableView經過重用單元格來達到節省內存的目的:經過爲每個單元格指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出屏幕時,贊成恢復單元格以便重用.對於不一樣種類的單元格使用不一樣的ID,對於簡單的表格,一個標識符就夠了.  假如一個TableView中有10個單元格,但是屏幕上最多能顯示4個,那麼實際上iPhone僅僅是爲其分配了4個單元格的內存,沒有分配10個,當滾動單元格時,屏幕內顯示的單元格反覆使用這4個內存   

1三、 viewcontroller的一些方法的說明viewDidLoad, viewWillDisappear, viewWillAppear方法的 順序和 做用? 

viewDidLoad:在視圖載入後被調用   viewWillAppear:視圖即將可見時調用。默認狀況下不運行不論什麼操做 

viewDidAppear: 視圖已全然過渡到屏幕上時調用  viewWillDisappear:視圖被駁回時調用。覆蓋或以其它方式隱藏。

默認狀況下不運行不論什麼操做  viewDidDisappear:視圖被駁回後調用,覆蓋或以其它方式隱藏。默認狀況下不運行不論什麼操做  先運行viewDidLoad再運行viewWillAppear。

   

1四、怎樣實現延遲載入圖片?以及載入圖片出現的超時問題? 
常常咱們會用tableView顯示很是多條目, 有時候需要顯示圖片, 但是一次從server上取來所有圖片對用戶來浪費流量, 對server也是負擔.最好是按需載入,即當該用戶要瀏覽該條目時再去載入它的圖片。  重寫例如如下方法 
 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath   
{    
     UIImage *image = [self getImageForCellAtIndexPath:indexPath];  //從網上取得圖片   
    [cell.imageView setImage:image];   
 }  

這儘管攻克了延時載入的問題, 但當網速很是慢, 或者圖片很是大時(假設,儘管通常cell中的圖很是小),你會發現程序可能會失去對用戶的響應. 
緣由是  
UIImage *image = [self getImageForCellAtIndexPath:indexPath];    

這種方法可能要花費大量的時間,主線程要處理這個method. 因此失去了對用戶的響應. 因此要將該方法提出來:  
- (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];   
}   

而後再新開一個線程去作這件事情  
 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath   
 {    
    [NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget: self withObject:indexPath];   
 }  
同理當咱們需要長時間的計算時,也要新開一個線程 去作這個計算以免程序處於假死狀態  以上代碼僅僅是演示樣例, 還可以改進的不少其它, 比方從網上down下來一次後就將圖片緩存起來,再次顯示的時候就不用去下載。

   

1四、Object-c的類可以多重繼承麼?可以實現多個接口麼?重寫一個類的方式用繼承好仍是分類好?爲何? 

Objective-c僅僅支持單繼承,假設要實現多繼承的話。可以經過類別和協議的方式來實現,cocoa 中所有的類都是NSObject 的子類,多繼承在這裏是用protocol 託付代理 來實現的。  

1五、簡單描寫敘述一下ios的內存管理機制?有沒有垃圾回收機制?與java有什麼差異? 

 Objective-C的對象在使用完畢以後不會本身主動銷燬。需要運行dealloc來釋放空間(銷燬)。不然內存泄露。誰建立,誰釋放(類似於「誰污染,誰治理」)。假設你經過alloc、new或copy來建立一個對象。那麼你必須調用release或autorelease。換句話說,不是你建立的,就不用你去釋放。

  

1六、 簡單描寫敘述一下多線程,以及怎樣處理ios多線程開發?什麼狀況下會使用多線程?長處?  

存放NSOperation的集合類。 操做和操做隊列,基本可以當作java中的線程和線程池的概念。用於處理ios多線程開發的問題。

網上部分資料提到一點是。儘管是queue,但是卻並不是帶有隊列的概念,放入的操做並不是是依照嚴格的先進現出。 這邊又有個疑點是。對於隊列來講,先進先出的概念是Afunc加入進隊列,Bfunc緊跟着也進入隊列。Afunc先運行這個是一定的, 但是Bfunc是等Afunc全然操做完之後。B才開始啓動並且運行。所以隊列的概念離亂上有點違背了多線程處理這個概念。 但是轉念一想事實上可以參考銀行的取票和叫號系統。 所以對於A比B先排隊取票但是B領先運行完操做,咱們亦然可以感性以爲這仍是一個隊列。 但是後來看到一票關於這操做隊列話題的文章,當中有一句提到 「因爲兩個操做提交的時間間隔很是近。線程池中的線程,誰先啓動是不定的。

」 瞬間以爲這個queue名字有點忽悠人了,還不如pool~ 綜合一點,咱們知道他可以比較大的用處在於可以幫組多線程編程就行了。   

1七、asihttp代碼原理,異步請求的原理,異步請求最大數目,爲何僅僅能這麼多? 

ASIHTTPRequest是一個簡易使用的類庫,經過包裝CFNetwork API 來簡化 和server端的通信. 它編寫的語言是Objective-C 可以應用於Mac OS X and iPhone 平臺的應用程序.   異步: 請求經過事件觸發->server處理(這是瀏覽器仍然可以做其它事情)->處理完畢   這個數量是跟cpu有關的,併發性取決於cpu核數,每個核僅僅能同一時候處理一個任務.4核cpu理論上可以併發處理4個任務,假設按http來算就是4個請求,但是cpu是搶佔式資源,因此通常來講併發量是要依據任務的耗時和cpu的繁忙度來計算4個左右僅僅是個經驗值你開10個短耗時的任務和幾個長耗時任務的效率是不一樣的。   

1八、 什麼是懶漢模式(懶載入)?何時使用?長處是什麼?  

懶漢模式。僅僅在用到的時候纔去初始化。 也可以理解成延時載入。 我以爲最好也最簡單的一個列子就是tableView中圖片的載入顯示了。 一個延時載。避免內存太高。一個異步載入。避免線程阻塞。   

1九、ios平臺怎麼作數據的持久化?coredata和sqlited 的聯繫?coredata是一個關係型數據庫嗎?

 iOS中可以有四種持久化數據的方式: 屬性列表、對象歸檔、SQLite3和Core Data。core data可以使你以圖形界面的方式高速的定義app的數據模型,同一時候在你的代碼中easy獲取到它。

core data提供了基礎結構去處理常用的功能,好比保存,恢復。撤銷和重作。贊成你在app中繼續建立新的任務。在使用core data的時候。你不用安裝額外的數據庫系統,因爲core data使用內置的sqlite數據庫。

core data將你app的模型層放入到一組定義在內存中的數據對象。core data會追蹤這些對象的改變,同一時候可以依據需要作相反的改變,好比用戶運行撤銷命令。當core data在對你app數據的改變進行保存的時候,core data會把這些數據歸檔,並永久性保存。   mac os x中sqlite庫,它是一個輕量級功能強大的關係數據引擎。也很是easy嵌入到應用程序。可以在多個平臺使用,sqlite是一個輕量級的嵌入式sql數據庫編程。

與core data框架不一樣的是。sqlite是使用程序式的,sql的基本的API來直接操做數據表。

  

20、什麼是PUSH(推送消息)? 在什麼狀況下使用。使用過哪些推送?百度雲推送? 

第 一階段:BeejiveIMserver把要發送的消息、目的iPhone的標識打包,發 給APNS。

   

第二階段:APNS在自身的已註冊Push服務 的iPhone列表中,查找有對應標識的iPhone,並把消息發到iPhone。

  

第三階段:iPhone把發來該消息發送到相應的應用程序, 並根據該設置彈出Push通知。

相關文章
相關標籤/搜索