首先申明:以下題目答案,僅是自己的總結(jié),如有錯誤,還請多多指正。
一,談一下對遠程推送(蘋果推送機制)的理解
對于蘋果推送機制,可分為大致5步:
1,手機應用程序向蘋果服務器(APNs)發(fā)送ssl請求,請求注冊推送通知的服務(即獲取推送證書)
2,蘋果服務器(APNs)分配給應用程序一個token值,生成了推送證書
3,應用程序把APNs分配的token值,發(fā)給自己的后臺
4,后臺把要推送的消息和token值發(fā)送給APNs
5,APNs根據(jù)這個token值和BuddleId查找應用程序,把消息推送出去
以下是我做的一個圖,幫助大家理解
二,類別和類擴展的區(qū)別
類別和類擴展都可以用來為類擴充的功能。
類別:可以為有源代碼的類和無源代碼的類擴充功能,而且只能添加方法(方法必須實現(xiàn)),子類可以繼承,可直接訪問。
類擴展:只能為有源代碼的類擴充功能,不僅可以擴充實例變量,也可以擴充方法。但是方法和實例變量都是私有的,子類可繼承,但不可直接訪問。
三,self.name = nil 的機制,以及 [ _name release] 的區(qū)別
self.name = nil 是調(diào)用屬性生成的setter方法,會將原有的對象釋放release,然后將實例變量的值置為空,以后在訪問該實例變量不會出現(xiàn)任何內(nèi)存問題。
[ _name release] 只是簡單的將對象的引用計數(shù)減1,而指針變量中依然存儲該對象的地址,如果此時該對象空間被系統(tǒng)回收了,再訪問實例變量,就會產(chǎn)生野指針異常。
四,數(shù)據(jù)持久化有哪幾種
1,plist文件,通常用于儲存用戶設(shè)置,也可用于儲存捆綁的信息
2,preference,偏好設(shè)置,常用于保存少量數(shù)據(jù)
3,NSKeyedArchiver,歸檔,將內(nèi)存中的對象實例保存成binary到磁盤并且可以逆向這個過程用來保存用戶操作狀態(tài)等
4,sqlite3,使用數(shù)據(jù)庫進行儲存
5,CoreData,它提供了對象----關(guān)系映射(ORM)的功能,既能將OC對象轉(zhuǎn)化成數(shù)據(jù)保存在sqlite數(shù)據(jù)庫文件中,也能將保存在數(shù)據(jù)庫中的數(shù)據(jù)還原成OC對象。
五,:比較GCD和NSOperation異同
GCD和NSOperation都是蘋果提供的多線程實現(xiàn)方案。GCD是基于C語言的API,使用起來方便在開發(fā)中大量使用,但是取消和暫停線程比較麻煩,另外蘋果專門對GCD做了性能上的優(yōu)化;而NSOperation是基于OC的,面向?qū)ο螅旨嫒軰VO,取消和暫停線程容易。
iOS首先引入的是NSOperation,在iOS4.0之后又引入的GCD和NSOperationQueue。
NSOperation:
1,NSOperation擁有很多函數(shù)。
2,在NSOperationQueue中可以建立各個NSOperation之間的依賴關(guān)系。
3,兼容KVO,可以監(jiān)測NSOperation是否正在執(zhí)行isExecuted,是否結(jié)束isFinished,是否取消isCanceled
4,NSOperationQueue可以方便的管理并發(fā),NSOperation之間的優(yōu)先級
GCD:
一般結(jié)合block使用。
六:UIViewController的生命周期方法有哪些
視圖創(chuàng)建:
alloc-------創(chuàng)建對象,分配內(nèi)存空間
init----------初始化對象
loadView---------從nib載入視圖,(這一步不需要去干涉,除非沒有使用xib創(chuàng)建)
ViewDidLoad-------載入完成,可以進行自定義數(shù)據(jù)以及動態(tài)創(chuàng)建其他控件
ViewWillAppear-------視圖將要出現(xiàn)在屏幕上
ViewDidAppear-------視圖已經(jīng)在屏幕上
視圖銷毀:
viewWillDisappear----------視圖將要從屏幕上移除
viewDidDisappear----------視圖已經(jīng)從屏幕上移除
dealloc----------視圖被銷毀
七,代理為什么使用weak
屬性關(guān)系:
ARC MRC
strong-------retain 強引用 引用計數(shù)+1
weak--------assign 弱引用 直接賦值
只要存在一個強引用,對象就會一直存在,不會被銷毀。在ARC下代理用weak要比用assign好,因為用weak,最后會走self.delegate = nil,而assign還可以指向被釋放掉的內(nèi)存,導致程序崩潰;retain引用計數(shù)+1,容易出現(xiàn)內(nèi)存錯誤。
八,CALayer和UIView關(guān)系是怎樣的
1,UIView可以相應事件,Layer不可以
UIView繼承于UIReponder,在UIResponder中系統(tǒng)定義處理各種事件和事件傳遞的接口,CALayer直接繼承于NSObject,沒有相應的處理事件接口。
2,View中的frame,bounds,center方法,UIView并沒有做什么,只是調(diào)用了底層的CALayer的方法。
3,UIView主要是對內(nèi)容的顯示管理,CALayer是內(nèi)容的繪制。
每個UIView內(nèi)部都有一個CALayer對內(nèi)容進行繪制顯示。
九,imageNamed:和 imageWithContentOfFile:區(qū)別
imageNamed采用緩存機制,會把讀到的圖片緩存起來,第二次讀到的時候直接加載,但是對象銷毀的時候,內(nèi)存不能釋放。
imageWithContentOfFile:會把圖片加載到內(nèi)存中,占用的內(nèi)存比較小,對象銷毀的時候,內(nèi)存可以釋放,但是會重復加載。
十,常見的OC數(shù)據(jù)類型有哪些,和C語言的有啥區(qū)別
OC:NSString,NSNumber,NSArray,NSMutableArray,NSData等都是class,創(chuàng)建之后便是對象。
C:int,一定字節(jié)的內(nèi)存空間,用來存放數(shù)值
十一,什么時候用delegate,什么時候用Notifaction
delegate針對一對一關(guān)系,并且reciever可以返回值給sender,所以delegate用于sender想要返回值的時候。
notifaction針對一對一或一對多,reciever無法返回值給sender,notifaction用于通知多個對象的時候。
十二,屬性意義
readwrite:讀寫,編譯器會自動合成getter,setter方法
readonly:只讀,編譯器會自動合成getter方法
assign(weak):弱引用,setter方法直接賦值,一般用于基本數(shù)據(jù)類型和結(jié)構(gòu)體類型
retain(strong):強引用,引用計數(shù)加1,一般用于對象類型
copy:與retain一樣,會將對象復制一份,引用計數(shù)會加1
atomic:原子屬性,保證同一時刻只有一條線程修改,訪問對應的實例變量
noatomic:非原子屬性,多線程并發(fā)訪問提高性能
十三,什么時候用NSMutableArray,什么時候用NSArray
NSArray:靜態(tài)的,不可變,一旦初始化,不能修改,可以讀取
NSMutableArray:動態(tài)的,可變,可以修改,可增加內(nèi)容
十四,KVO,NSNotification和代理,KVC的區(qū)別
KVO:觀察者模式,被觀察者直接把消息發(fā)給觀察者,是對象之間的交互。
NSNotification:觀察者模式,被觀察者把消息發(fā)給通知中心,通知中心再把消息發(fā)給觀察者,并不直接交互。
代理:代理只能一對一,一個對象只有一個代理
KVO和通知:可以一對多,一個通知可以發(fā)給多個觀察者
KVC:鍵值編碼,一種間接訪問對象的屬性使用字符串來標識屬性
十五,寫出NSTimer使用時注意事項
1,timer在不需要時,一定要調(diào)用invalidate方法使他失效,否則不能釋放
timer要想銷毀,必須先將他置為失效,否則timer會一直占用內(nèi)存不能釋放,造成內(nèi)存泄漏,且該內(nèi)存泄漏不能用xcode,instruments檢測出來。
2,timer使用的時候需要加到runloop中
十六,列舉熟悉的cocoa touch框架
Core Audio :強大的音頻功能
CoreData :數(shù)據(jù)庫管理
cocoa touch一小部分框架:
音視頻:core Audio ,Media library ,AV Foundation
數(shù)據(jù)管理:coreData, sqlite
圖形動畫:core Animation,OpenGl,Quartz 2D
網(wǎng)絡應用:webKit,BSD, sockets
用戶應用:Address Book ,core Location ,Mapkit ,storeKit
十七,iOS內(nèi)存管理
誰申請,誰釋放
內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”。對于“過早釋放”,要注意使用@property設(shè)置特性時,一定要用對特性關(guān)鍵字;對于“內(nèi)存泄漏”,申請了記得釋放。
alloc和new生成的對象需要手動釋放。
設(shè)置@property正確的屬性,retain在合適的地方釋放。
十八,項目目錄結(jié)構(gòu)
一個合理的目錄結(jié)構(gòu)首先應該是清晰的,讓人一眼看上去就能大概了解目錄的職責,且容易應對新的變化。
目錄結(jié)構(gòu)
AppDelegate 這個目錄下放的是AppDelegate.h(.m)文件,是整個應用的入口文件,單獨拿出來。
Models 這個目錄下放一些與數(shù)據(jù)相關(guān)的Model文件BaseModel.h BaseModel.m…….
View(視圖):
Controller(控制器):
Expand(拓展):
放一些工具類(Tool),宏
網(wǎng)絡(Network),
分類(Category),
數(shù)據(jù)庫(DataBase)等
Resource(資源):plist文件或者圖片之類
.pch:文件放的是一些宏定義一些接口之類
十九,常用的第三方框架
MBProgressHUD提示效果 支持各種狀態(tài)加載的提示效果,以及帶進度的提示效果。
SDWebImage圖片異步加載及緩存SDWebImage用于異步下載網(wǎng)絡上的圖片,并支持對圖片的緩存等。
XMPP 實時聊天,XMPP協(xié)議算是很成熟的方案了。使用XMPPFramework可以直接和OpenFire服務器打交道。
AFNetworking 網(wǎng)絡請求
FMDB 數(shù)據(jù)庫
Masonry 純代碼添加約束
二十,CoreData:
Core Data是iOS5之后才出現(xiàn)的一個框架,它提供了對象-關(guān)系映射(ORM)的功能,即能夠?qū)C對象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對象。在此數(shù)據(jù)操作期間,我們不需要編寫任何SQL語句,
1.Core Data 是數(shù)據(jù)持久化存儲的最佳方式
2.數(shù)據(jù)最終的存儲類型可以是:SQLite數(shù)據(jù)庫,XML,二進制,內(nèi)存里,或自定義數(shù)據(jù)類型
在Mac OS X 10.5Leopard及以后的版本中,開發(fā)者也可以通過繼承NSPersistentStore類以創(chuàng)建自定義的存儲格式
3.好處:能夠合理管理內(nèi)存,避免使用sql的麻煩,高效
4.構(gòu)成:
(1)NSManagedObjectContext(被管理的數(shù)據(jù)上下文)操作實際內(nèi)容(操作持久層)
作用:插入數(shù)據(jù),查詢數(shù)據(jù),刪除數(shù)據(jù)
(2)NSManagedObjectModel(被管理的數(shù)據(jù)模型)數(shù)據(jù)庫所有表格或數(shù)據(jù)結(jié)構(gòu),包含各實體的定義信息
作用:添加實體的屬性,建立屬性之間的關(guān)系
操作方法:視圖編輯器,或代碼
(3)NSPersistentStoreCoordinator(持久化存儲助理)相當于數(shù)據(jù)庫的連接器
作用:設(shè)置數(shù)據(jù)存儲的名字,位置,存儲方式,和存儲時機
(4)NSManagedObject(被管理的數(shù)據(jù)記錄) 相當于數(shù)據(jù)庫中的表格記錄
(5)NSFetchRequest(獲取數(shù)據(jù)的請求)相當于查詢語句
(6)NSEntityDescription(實體結(jié)構(gòu))相當于表格結(jié)構(gòu)
二十一,OC優(yōu)缺點
優(yōu)點:
1.Category是非常實用的擴展機制,可以很方便的為一個已有的類添加屬性或者方法,而不需要笨拙的去繼承。
2.運行時多態(tài)的概念,可以讓一個類的對象動態(tài)的以其他類行為去執(zhí)行(OC中多了很多運行時態(tài)的機制,其中id的特殊用途,可以通過id類型的變量,調(diào)用不同類的同名函數(shù),即使這些類沒有任何關(guān)系)。
3.ARC不用多講了吧
4.OC中成員變量也有三種訪問權(quán)限,@public,@protected,@private。但默認的是@protected,而C++中默認是private
5.OC中成員函數(shù)只有兩種,一種是實例函數(shù),一種是類函數(shù)。實例函數(shù)就是
C++中的Public函數(shù),類函數(shù)就是public中的static函數(shù)。
6.OC中成員函數(shù)如果要接受多個參數(shù),則需要每個參數(shù)前加冒號
7,OC還有protocol概念, 通過@protocol-@end來聲明protocol。類中通過<protocol1,protocol2,...>來表示支持某個協(xié)議。如@interface A : Object < NSCopying, NSTransform >-@end表明類A繼承與Object類,并支持兩個協(xié)議(NSCopying, NSTransform )。
8.由于都是C衍生出的面向?qū)ο蟮恼Z言所以可以和C++混合編碼。(百度地圖API
就用到了)
缺點:
1.不支持多重繼承
二十二,MVC設(shè)計模式是什么?你還熟悉什么模式?
M:model,負責儲存,定義,操作數(shù)據(jù)
V:view,展示數(shù)據(jù)給用戶,和用戶交互
C:controller,Model和View之間的協(xié)調(diào)者,把model中的數(shù)據(jù)拿過來給View用。
代理模式:工廠生產(chǎn)了產(chǎn)品不直接賣,而是找代理商賣產(chǎn)品
單例模式:不通過alloc創(chuàng)建對象,通過靜態(tài)方法返回這個類的對象,全局唯一。
觀察者模式:一個對象改變,所有的觀察者都會做出反應。
工廠模式:工廠加工產(chǎn)品
二十三,深拷貝,淺拷貝
淺拷貝:只復制對象的指針,(如人的影子)
深拷貝:復制對象(如人的克隆體)
以對象A為例:
淺拷貝后,只是復制了A的指針,出現(xiàn)一個A_淺 ,指向同一塊內(nèi)存資源,修改A_淺,A也會改變。
深拷貝后,復制了對象,出現(xiàn)一個A_深,內(nèi)存中就有了2個獨立的對象,一個A,一個A_深,A_深改變,A不會改變。
二十四,#import,#include,@class,#import<> ,#import""
import:OC中導入頭文件的關(guān)鍵字,只會導入一次,不會重復導入
#import<>導入系統(tǒng)的,#import“”導入非系統(tǒng)的
include:C語言導入頭文件的關(guān)鍵詞,會重復導入
@class:聲明某個類,執(zhí)行時才去查看類的實現(xiàn)文件,解決頭文件的相互包含
二十五,NSString *obj = [[NSData alloc] init];編譯,運行時分別是什么樣的類型。
編譯是NSString,運行是NSData
二十六,OC是動態(tài)運行時語言是什么意思
多態(tài),主要將數(shù)據(jù)類型的確定由編譯時推遲到運行時。
運行時機制使我們在運行時才去決定一個對象的類別,以及調(diào)用該類別對象的指定方法。
多態(tài):不同對象以自己的方式響應同一個消息。因此,可以說運行時機制是多態(tài)的基礎(chǔ)。
二十七,frame和bounds有啥不同
frame,參照的是父視圖,bounds,參照的是自身
二十八,線程和進程區(qū)別和聯(lián)系
1,線程和進程都是操作系統(tǒng)運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)并發(fā)性。
2,線程和進程的主要差別在于他們不同的操作系統(tǒng)資源管理方式。
進程:有獨立的地址空間,一個進程崩潰,不會對其他進程產(chǎn)生影響。
線程:是進程中不同的執(zhí)行路徑,有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間。一個線程死掉等于整個進程死掉。
3,每個進程之間是相互獨立的,1個進程要想執(zhí)行任務,必須得有線程(每個進程至少有一個線程)
線程-------》工人 進程-------》車間
二十九,socket與http的區(qū)別
http:客戶端主動向服務器發(fā)起http請求,一次連接之后立馬斷開
socket:客戶端和服務器使用“套接字”進行連接,雙方都可以主動發(fā)送數(shù)據(jù),一次連接之后可以保持聯(lián)通。
三十,block
1,block是對象,他封裝了一段代碼,這段代碼可以在任何時候執(zhí)行,
2,block可以作為函數(shù)或者函數(shù)的返回值經(jīng)常用于回調(diào)及傳值,而其本身又可以帶輸入?yún)?shù)或者返回值,他和傳統(tǒng)的函數(shù)指針類似,但有區(qū)別:block是inline的,并且他對局部變量是只讀的。
3,block是存在于棧中的,定義block是用copy,從棧中copy到堆中。MRC下,用_ block,ARC下,用 _weak .
三十一,堆和棧
1)管理方式
棧:編譯器自動管理
堆:由程序員釋放
2)申請大?。?br>
棧:向低地址擴展的數(shù)據(jù)結(jié)構(gòu),一塊連續(xù)的內(nèi)存區(qū)域。
堆:向高地址擴展的數(shù)據(jù)結(jié)構(gòu),不連續(xù)的內(nèi)存區(qū)域。
3)碎片:
棧:沒有
堆:不連續(xù),有大量的碎片
4)分配方式:
棧:靜態(tài),動態(tài)兩種分配方式
堆:只有動態(tài)分配
5)分配效率:
棧:棧是系統(tǒng)提供的,效率高
堆:C++函數(shù)庫提供的,效率低
三十二,一個tableView是否可以關(guān)聯(lián)兩個不同的數(shù)據(jù)源?你會怎么處理?
答:首先我們從代碼來看,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實現(xiàn)的。
因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源。
因此,我覺得可以設(shè)置多個數(shù)據(jù)源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?
三十三,xib和stroyboard的區(qū)別:
一個工程中可以有多個xib文件,一個xib文件對應著一個視圖控制器和多個視圖。而使用storyboard時,一個工程只需要一個主storyboard文件就可以了。因此,在包含多個視圖控制器的情況下,采用storyboard管理比較方便,而且storyboard還可以描述界面之間的導航關(guān)系。
三十四,關(guān)于自動釋放池是什么?怎么工作?
當您向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當?shù)膶ο螅虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息。當程序執(zhí)行到作用域結(jié)束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。
ojc-c是通過一種"referring counting"(引用計數(shù))的方式來管理內(nèi)存的,對象在開始分配內(nèi)存(alloc)的時候引用計數(shù)為一,以后每當碰到有copy,retain的時候引用計數(shù)都會加一,每當碰到release和autorelease的時候引用計數(shù)就會減一,如果此對象的計數(shù)變?yōu)榱?,就會被系統(tǒng)銷毀.
NSAutoreleasePool就是用來做引用計數(shù)的管理工作的,這個東西一般不用你管的.
autorelease和release沒什么區(qū)別,只是引用計數(shù)減一的時機不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一.
三十五,app升級要改變數(shù)據(jù)庫結(jié)構(gòu)怎么辦?
數(shù)據(jù)庫升級流程
1.每一次運行程序,判斷數(shù)據(jù)庫是否存在。如果不存在,創(chuàng)建數(shù)據(jù)庫。如果存在,進行其他后續(xù)處理。
2.第一次安裝app,創(chuàng)建數(shù)據(jù)庫,并將版本號存入數(shù)據(jù)庫中。同時保存一個當前版本號加1的字段到數(shù)據(jù)庫中。
3.更新app,從數(shù)據(jù)庫中讀取到上一次保存的版本號字段。比如要升級為2,會直接從case2開始執(zhí)行。修改完數(shù)據(jù)結(jié)構(gòu)后,再一次將版本號字段存入數(shù)據(jù)庫。
4.每一次數(shù)據(jù)庫結(jié)構(gòu)有更新,直接在后面加case語句即可。
三十六,沙盒目錄結(jié)構(gòu)
/Documents/ 保存應用程序的重要數(shù)據(jù)文件和用戶數(shù)據(jù)文件等。iTunes 同步時會備份該目錄。
/Library/Caches 保存應用程序使用時產(chǎn)生的支持文件和緩存文件,還有日志文件最好也放在這個目錄。iTunes 同步時不會備份該目錄。
/Library/Preferences 保存應用程序的偏好設(shè)置文件(使用 NSUserDefaults 類設(shè)置時創(chuàng)建,不應該手動創(chuàng)建)。
/tmp/ 保存應用運行時所需要的臨時數(shù)據(jù),iphone 重啟時,會清除該目錄下所有文件。
三十七,單例模式
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
});
return _instance;
}
//全局變量
static id _instance = nil;
//單例方法
+(instancetype)sharedSingleton{
return [[self alloc] init];
}