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等。
接着系統會激活該上下文,而後向需要回執的UIView對象發送drawRect:消息。
注意:僅僅能在drawRect:方法中調用繪圖方法或函數。
除了drawRect:方法,沒法從其它地方得到激活狀態的CGContextRef.也就沒法調用灰土方法或函數。
要實現縮放功能。則需要爲UIScrollView設置託付對象UIScrollViewDelegate協議並使用setMinimumZoomScale,setMaximumZoomScale方法來啓用縮放功能,且要實現viewForZoomingInScrollView:(該方法返回UIScrollView對象需要縮放的視圖)。
建立UIViewController子類實例時,經過指定初始化方法 initWithNibName:bundle: 傳入XIB的文件名稱。當視圖控制對象需要使用實例變量view的時候,會查看應用程序包內是否存在對應名稱的XIB文件(假設傳入的名稱是nil,那麼UIViewController對象會查找和這個UIViewController子類的類名匹配的XIB文件)。
二、幾個關於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對象就會進入編輯模式。
三、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來取消第一響應狀態。
二、UIToolbar對象和UINavigationBar類似,差異是UINavigationBar僅僅能有兩個UIBarButtonItem對象。而UIToolbar可以有一組UIBarButtonItem對象。
三、啓用相機拍照功能需要用到UIImagePickerController實例。並且必須設定事實上例屬性sourceType並設置託付對象(UIImagePickerControllerDelegate),此外。因爲UIImagePickerController是UINavigationController的子類,因此也需要遵照UINavigationControllerDelegate協議。
sourceType有三種 :UIImagePickerControllerSourceTypeCamera:用戶將拍攝一張新照片。 UIImagePickerControllerSourceTypePhotoLibrary:顯示界面,讓用戶選擇相冊,而後從該相冊選擇一張照片。UIImagePickerControllerSourceTypeSavedPhotosAlbum:讓用戶從近期拍攝的照片裏選擇一張照片。 選中照片時會觸發UIImagePickerControllerDelegate下的imagePickerController:didFinishPickingMediaWithInfo:消息,經過該消息可以獲取選擇的圖片對象(UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage])。
五、 類型爲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).六、取消點擊textField出現的鍵盤:[textField resignFirstResponder]; //取消第一響應對象狀態
二、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 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實例自己就是一個數據容器。可以存放對象和對象的數據。
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 對象。
使用通知中心實例的 addObserver:selector:name:object:方法可以將指定對象註冊爲觀察器,由通告觸發的方法會帶一個參數。該參數是一個NSNotification對象,有三個屬性:object。name。userInfo(NSDictionary對象)。
發送通告:[[NSNotificationCenter defaultCenter] postNotification: NSNotification實例]。
通告中心不會保留觀察器。在通告中心註冊過的對象,必須在釋放前取消註冊。
不然,當響應的通告再次出現時。通告中心仍然會向該觀察器發送消息,因爲對應的對象已經釋放了。因此會致使應用崩潰。
二、UIDevice 對象會不間斷地發送通告。如下是UIDevice 對象所發通告的名稱常量。
UIDevice Orientation/BatteryState/BatteryLevel/ProximityState DidChangeNotification .固化最大的缺點是數據必須整存整取,要訪問固化文件裏的不論什麼數據,必須解固整個文件,要更新數據的不論什麼變更,必須重寫整個文件。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 對象,返回符合指定條件的對象。
此外,這個對象還可以用於數組的過濾。
二、偏好設置鍵的常用命名規定:應用名 + 偏好設置名 + 單詞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設置的時長,每隔一段時間報告方向感應器的數據變化。
motionBegan:withEvent: 和 motionEnded:withEvent: 和 motionCancelled:withEvent: 。
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?二、NSURLRequest: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
• + (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請求
三、NSURLConnection
同步請求:• + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error• 最快捷的方式
• - (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
• - (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL • - (void)loadRequest:(NSURLRequest *)request • - (void)reload • BOOL detectsPhoneNumbers • BOOL scalesPageToFit
二、導航欄
在縱向模式下導航欄爲44像素高,在橫向模式下爲32像素高,導航欄提供了一個很是少用的提示模式。該模式將高度擴展了30像素,在縱向模式下爲320*74像素,在橫向模式下爲480*74像素。
三、選項卡 工具欄
選項卡爲48像素高,工具欄爲44像素高。此兩個UI元素通長不用於橫向模式。
四、鍵盤和pickerView
此通常都爲橫向320*216像素。縱向爲480*162像素。
五、UIScreen類
[[UIScreen mainScreen] applicationFrame]一般會依據正在使用的工具欄,狀態欄。導航欄來返回可用的區域。
三、 需要爲定時器所在的線程設置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可以高速定位根源所在。
三、 TSAlertView可以在彈出框(UIAlertView)中設置輸入框,類似於JavaScript中的prompt 。
四、ZipArchive對文件進行壓縮和解壓操做。
五、 ASIHTTPRequest數據的上傳和下載,以及斷點續傳。
六、 json-framework文件格式解析。
二、 Crashlytics.framework可以記錄應用程序崩潰日誌。並高速定位到出問題的代碼行。
假設使用過,你用它作了什麼?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?
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時使用到。
(有需要的話還可以涉及Quartz的一些內容)
UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。
UIKit | ------------ | Core Animation | Core Graphics | Graphics Hardware|
假設使用過,請談談你使用CoreText或者CoreImage的體驗。
CoreText可以解決複雜文字內容排版問題。CoreImage可以處理圖片,爲其加入各類效果。體驗是很是強大,挺複雜的。
好比將Module層的變化。通知到多個Controller對象時,可以使用NSNotification。假設是僅僅需要觀察某個對象的某個屬性,可以使用KVO。
對於託付模式,在設計模式中是對象適配器模式。其是delegate是指向某個對象的,這是一對一的關係。而在通知模式中,每每是一對多的關係。託付模式。從技術上可以現在改變delegate指向的對象。但不建議這樣作,會讓人迷惑,假設一個delegate對象不斷改變,指向不一樣的對象。
項目中使用NSOperation的長處是NSOperation是對線程的高度抽象,在項目中使用它。會使項目的程序結構更好,子類化NSOperation的設計思路。是具備面向對象的長處(複用、封裝)。使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的長處是GCD自己很是簡單、易用。對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。
使用block是要注意,若將block作函數參數時,需要把它放到最後,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是可以讀取其它函數內部變量的函數。
使用NSOperation發送異步網絡請求,使用NSOperationQueue管理線程數目及優先級。底層是用NSURLConnetion,詳細可見開源框架[LWConnetion](https://github.com/xunyn/LWConnetionDemo)。
假設可以的話。你有沒有考慮或者實踐過又一次實現OC的一些功能,假設有,詳細會怎樣作?
最大的長處是它的運行時特性,不足是沒有命名空間。對於命名衝突,可以使用長命名法或特殊前綴解決。假設是引入的第三方庫之間的命名衝突,可以使用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。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRow AtIndexPath:(NSIndexPath *)indexPath { UIImage *image = [self getImageForCellAtIndexPath:indexPath]; //從網上取得圖片 [cell.imageView setImage:image]; }
UIImage *image = [self getImageForCellAtIndexPath:indexPath];
- (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下來一次後就將圖片緩存起來,再次顯示的時候就不用去下載。
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 來簡化 和server端的通信. 它編寫的語言是Objective-C 可以應用於Mac OS X and iPhone 平臺的應用程序. 異步: 請求經過事件觸發->server處理(這是瀏覽器仍然可以做其它事情)->處理完畢 這個數量是跟cpu有關的,併發性取決於cpu核數,每個核僅僅能同一時候處理一個任務.4核cpu理論上可以併發處理4個任務,假設按http來算就是4個請求,但是cpu是搶佔式資源,因此通常來講併發量是要依據任務的耗時和cpu的繁忙度來計算4個左右僅僅是個經驗值你開10個短耗時的任務和幾個長耗時任務的效率是不一樣的。
懶漢模式。僅僅在用到的時候纔去初始化。 也可以理解成延時載入。 我以爲最好也最簡單的一個列子就是tableView中圖片的載入顯示了。 一個延時載。避免內存太高。一個異步載入。避免線程阻塞。
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來直接操做數據表。
第 一階段:BeejiveIMserver把要發送的消息、目的iPhone的標識打包,發 給APNS。
第二階段:APNS在自身的已註冊Push服務 的iPhone列表中,查找有對應標識的iPhone,並把消息發到iPhone。
第三階段:iPhone把發來該消息發送到相應的應用程序, 並根據該設置彈出Push通知。