首先申明:以下題目答案,僅是自己的總結(jié)缀踪,如有錯(cuò)誤居砖,還請(qǐng)多多指正。
一驴娃,談一下對(duì)遠(yuǎn)程推送(蘋果推送機(jī)制)的理解
對(duì)于蘋果推送機(jī)制奏候,可分為大致5步:
1,手機(jī)應(yīng)用程序向蘋果服務(wù)器(APNs)發(fā)送ssl請(qǐng)求唇敞,請(qǐng)求注冊(cè)推送通知的服務(wù)(即獲取推送證書)
2蔗草,蘋果服務(wù)器(APNs)分配給應(yīng)用程序一個(gè)token值,生成了推送證書
3疆柔,應(yīng)用程序把APNs分配的token值咒精,發(fā)給自己的后臺(tái)
4,后臺(tái)把要推送的消息和token值發(fā)送給APNs
5旷档,APNs根據(jù)這個(gè)token值和BuddleId查找應(yīng)用程序模叙,把消息推送出去
以下是我做的一個(gè)圖,幫助大家理解
二鞋屈,類別和類擴(kuò)展的區(qū)別
類別和類擴(kuò)展都可以用來為類擴(kuò)充的功能范咨。
類別:可以為有源代碼的類和無源代碼的類擴(kuò)充功能,而且只能添加方法(方法必須實(shí)現(xiàn))厂庇,子類可以繼承渠啊,可直接訪問。
類擴(kuò)展:只能為有源代碼的類擴(kuò)充功能权旷,不僅可以擴(kuò)充實(shí)例變量替蛉,也可以擴(kuò)充方法。但是方法和實(shí)例變量都是私有的,子類可繼承躲查,但不可直接訪問它浅。
三,self.name = nil 的機(jī)制熙含,以及 [ _name release] 的區(qū)別
self.name = nil 是調(diào)用屬性生成的setter方法罚缕,會(huì)將原有的對(duì)象釋放release,然后將實(shí)例變量的值置為空怎静,以后在訪問該實(shí)例變量不會(huì)出現(xiàn)任何內(nèi)存問題邮弹。
[ _name release] 只是簡單的將對(duì)象的引用計(jì)數(shù)減1,而指針變量中依然存儲(chǔ)該對(duì)象的地址蚓聘,如果此時(shí)該對(duì)象空間被系統(tǒng)回收了腌乡,再訪問實(shí)例變量,就會(huì)產(chǎn)生野指針異常夜牡。
四与纽,數(shù)據(jù)持久化有哪幾種
1,plist文件塘装,通常用于儲(chǔ)存用戶設(shè)置急迂,也可用于儲(chǔ)存捆綁的信息
2,preference蹦肴,偏好設(shè)置僚碎,常用于保存少量數(shù)據(jù)
3,NSKeyedArchiver阴幌,歸檔勺阐,將內(nèi)存中的對(duì)象實(shí)例保存成binary到磁盤并且可以逆向這個(gè)過程用來保存用戶操作狀態(tài)等
4,sqlite3矛双,使用數(shù)據(jù)庫進(jìn)行儲(chǔ)存
5渊抽,CoreData,它提供了對(duì)象----關(guān)系映射(ORM)的功能议忽,既能將OC對(duì)象轉(zhuǎn)化成數(shù)據(jù)保存在sqlite數(shù)據(jù)庫文件中懒闷,也能將保存在數(shù)據(jù)庫中的數(shù)據(jù)還原成OC對(duì)象。
五栈幸,:比較GCD和NSOperation異同
GCD和NSOperation都是蘋果提供的多線程實(shí)現(xiàn)方案愤估。GCD是基于C語言的API,使用起來方便在開發(fā)中大量使用侦镇,但是取消和暫停線程比較麻煩,另外蘋果專門對(duì)GCD做了性能上的優(yōu)化织阅;而NSOperation是基于OC的壳繁,面向?qū)ο螅旨嫒軰VO,取消和暫停線程容易闹炉。
iOS首先引入的是NSOperation蒿赢,在iOS4.0之后又引入的GCD和NSOperationQueue。
NSOperation:
1渣触,NSOperation擁有很多函數(shù)羡棵。
2,在NSOperationQueue中可以建立各個(gè)NSOperation之間的依賴關(guān)系嗅钻。
3皂冰,兼容KVO,可以監(jiān)測(cè)NSOperation是否正在執(zhí)行isExecuted养篓,是否結(jié)束isFinished秃流,是否取消isCanceled
4,NSOperationQueue可以方便的管理并發(fā)柳弄,NSOperation之間的優(yōu)先級(jí)
GCD:
一般結(jié)合block使用舶胀。
六:UIViewController的生命周期方法有哪些
視圖創(chuàng)建:
alloc-------創(chuàng)建對(duì)象,分配內(nèi)存空間
init----------初始化對(duì)象
loadView---------從nib載入視圖碧注,(這一步不需要去干涉嚣伐,除非沒有使用xib創(chuàng)建)
ViewDidLoad-------載入完成,可以進(jìn)行自定義數(shù)據(jù)以及動(dòng)態(tài)創(chuàng)建其他控件
ViewWillAppear-------視圖將要出現(xiàn)在屏幕上
ViewDidAppear-------視圖已經(jīng)在屏幕上
視圖銷毀:
viewWillDisappear----------視圖將要從屏幕上移除
viewDidDisappear----------視圖已經(jīng)從屏幕上移除
dealloc----------視圖被銷毀
七萍丐,代理為什么使用weak
屬性關(guān)系:
ARC MRC
strong-------retain 強(qiáng)引用 引用計(jì)數(shù)+1
weak--------assign 弱引用 直接賦值
只要存在一個(gè)強(qiáng)引用轩端,對(duì)象就會(huì)一直存在,不會(huì)被銷毀碉纺。在ARC下代理用weak要比用assign好船万,因?yàn)橛脀eak,最后會(huì)走self.delegate = nil,而assign還可以指向被釋放掉的內(nèi)存骨田,導(dǎo)致程序崩潰耿导;retain引用計(jì)數(shù)+1,容易出現(xiàn)內(nèi)存錯(cuò)誤态贤。
八舱呻,CALayer和UIView關(guān)系是怎樣的
1,UIView可以相應(yīng)事件悠汽,Layer不可以
UIView繼承于UIReponder箱吕,在UIResponder中系統(tǒng)定義處理各種事件和事件傳遞的接口,CALayer直接繼承于NSObject柿冲,沒有相應(yīng)的處理事件接口茬高。
2,View中的frame假抄,bounds怎栽,center方法丽猬,UIView并沒有做什么,只是調(diào)用了底層的CALayer的方法熏瞄。
3脚祟,UIView主要是對(duì)內(nèi)容的顯示管理,CALayer是內(nèi)容的繪制强饮。
每個(gè)UIView內(nèi)部都有一個(gè)CALayer對(duì)內(nèi)容進(jìn)行繪制顯示由桌。
九,imageNamed:和 imageWithContentOfFile:區(qū)別
imageNamed采用緩存機(jī)制邮丰,會(huì)把讀到的圖片緩存起來行您,第二次讀到的時(shí)候直接加載,但是對(duì)象銷毀的時(shí)候柠座,內(nèi)存不能釋放邑雅。
imageWithContentOfFile:會(huì)把圖片加載到內(nèi)存中,占用的內(nèi)存比較小妈经,對(duì)象銷毀的時(shí)候淮野,內(nèi)存可以釋放,但是會(huì)重復(fù)加載吹泡。
十骤星,常見的OC數(shù)據(jù)類型有哪些,和C語言的有啥區(qū)別
OC:NSString爆哑,NSNumber洞难,NSArray鸵熟,NSMutableArray验夯,NSData等都是class丽旅,創(chuàng)建之后便是對(duì)象乏屯。
C:int,一定字節(jié)的內(nèi)存空間栋烤,用來存放數(shù)值
十一推掸,什么時(shí)候用delegate滔岳,什么時(shí)候用Notifaction
delegate針對(duì)一對(duì)一關(guān)系屯换,并且reciever可以返回值給sender编丘,所以delegate用于sender想要返回值的時(shí)候。
notifaction針對(duì)一對(duì)一或一對(duì)多彤悔,reciever無法返回值給sender嘉抓,notifaction用于通知多個(gè)對(duì)象的時(shí)候。
十二晕窑,屬性意義
readwrite:讀寫抑片,編譯器會(huì)自動(dòng)合成getter,setter方法
readonly:只讀杨赤,編譯器會(huì)自動(dòng)合成getter方法
assign(weak):弱引用敞斋,setter方法直接賦值级遭,一般用于基本數(shù)據(jù)類型和結(jié)構(gòu)體類型
retain(strong):強(qiáng)引用,引用計(jì)數(shù)加1渺尘,一般用于對(duì)象類型
copy:與retain一樣,會(huì)將對(duì)象復(fù)制一份说敏,引用計(jì)數(shù)會(huì)加1
atomic:原子屬性鸥跟,保證同一時(shí)刻只有一條線程修改,訪問對(duì)應(yīng)的實(shí)例變量
noatomic:非原子屬性盔沫,多線程并發(fā)訪問提高性能
十三医咨,什么時(shí)候用NSMutableArray,什么時(shí)候用NSArray
NSArray:靜態(tài)的架诞,不可變拟淮,一旦初始化,不能修改谴忧,可以讀取
NSMutableArray:動(dòng)態(tài)的很泊,可變,可以修改沾谓,可增加內(nèi)容
十四委造,KVO,NSNotification和代理均驶,KVC的區(qū)別
KVO:觀察者模式昏兆,被觀察者直接把消息發(fā)給觀察者,是對(duì)象之間的交互妇穴。
NSNotification:觀察者模式爬虱,被觀察者把消息發(fā)給通知中心,通知中心再把消息發(fā)給觀察者腾它,并不直接交互跑筝。
代理:代理只能一對(duì)一,一個(gè)對(duì)象只有一個(gè)代理
KVO和通知:可以一對(duì)多携狭,一個(gè)通知可以發(fā)給多個(gè)觀察者
KVC:鍵值編碼继蜡,一種間接訪問對(duì)象的屬性使用字符串來標(biāo)識(shí)屬性
十五,寫出NSTimer使用時(shí)注意事項(xiàng)
1逛腿,timer在不需要時(shí)稀并,一定要調(diào)用invalidate方法使他失效,否則不能釋放
timer要想銷毀单默,必須先將他置為失效碘举,否則timer會(huì)一直占用內(nèi)存不能釋放,造成內(nèi)存泄漏搁廓,且該內(nèi)存泄漏不能用xcode引颈,instruments檢測(cè)出來耕皮。
2,timer使用的時(shí)候需要加到runloop中
十六蝙场,列舉熟悉的cocoa touch框架
Core Audio :強(qiáng)大的音頻功能
CoreData :數(shù)據(jù)庫管理
cocoa touch一小部分框架:
音視頻:core Audio 凌停,Media library ,AV Foundation
數(shù)據(jù)管理:coreData售滤, sqlite
圖形動(dòng)畫:core Animation罚拟,OpenGl,Quartz 2D
網(wǎng)絡(luò)應(yīng)用:webKit完箩,BSD, sockets
用戶應(yīng)用:Address Book 赐俗,core Location ,Mapkit 弊知,storeKit
十七阻逮,iOS內(nèi)存管理
誰申請(qǐng),誰釋放
內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”秩彤。對(duì)于“過早釋放”叔扼,要注意使用@property設(shè)置特性時(shí),一定要用對(duì)特性關(guān)鍵字漫雷;對(duì)于“內(nèi)存泄漏”币励,申請(qǐng)了記得釋放。
alloc和new生成的對(duì)象需要手動(dòng)釋放珊拼。
設(shè)置@property正確的屬性食呻,retain在合適的地方釋放。
十八澎现,項(xiàng)目目錄結(jié)構(gòu)
一個(gè)合理的目錄結(jié)構(gòu)首先應(yīng)該是清晰的仅胞,讓人一眼看上去就能大概了解目錄的職責(zé),且容易應(yīng)對(duì)新的變化剑辫。
目錄結(jié)構(gòu)
AppDelegate 這個(gè)目錄下放的是AppDelegate.h(.m)文件干旧,是整個(gè)應(yīng)用的入口文件,單獨(dú)拿出來妹蔽。
Models 這個(gè)目錄下放一些與數(shù)據(jù)相關(guān)的Model文件BaseModel.h BaseModel.m…….
View(視圖):
Controller(控制器):
Expand(拓展):
放一些工具類(Tool),宏
網(wǎng)絡(luò)(Network),
分類(Category),
數(shù)據(jù)庫(DataBase)等
Resource(資源):plist文件或者圖片之類
.pch:文件放的是一些宏定義一些接口之類
十九椎眯,常用的第三方框架
MBProgressHUD提示效果 支持各種狀態(tài)加載的提示效果,以及帶進(jìn)度的提示效果胳岂。
SDWebImage圖片異步加載及緩存SDWebImage用于異步下載網(wǎng)絡(luò)上的圖片编整,并支持對(duì)圖片的緩存等。
XMPP 實(shí)時(shí)聊天乳丰,XMPP協(xié)議算是很成熟的方案了掌测。使用XMPPFramework可以直接和OpenFire服務(wù)器打交道。
AFNetworking 網(wǎng)絡(luò)請(qǐng)求
FMDB 數(shù)據(jù)庫
Masonry 純代碼添加約束
二十产园,CoreData:
Core Data是iOS5之后才出現(xiàn)的一個(gè)框架汞斧,它提供了對(duì)象-關(guān)系映射(ORM)的功能夜郁,即能夠?qū)C對(duì)象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫文件中粘勒,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對(duì)象竞端。在此數(shù)據(jù)操作期間,我們不需要編寫任何SQL語句庙睡,
1.Core Data 是數(shù)據(jù)持久化存儲(chǔ)的最佳方式
2.數(shù)據(jù)最終的存儲(chǔ)類型可以是:SQLite數(shù)據(jù)庫婶熬,XML,二進(jìn)制埃撵,內(nèi)存里,或自定義數(shù)據(jù)類型
在Mac OS X 10.5Leopard及以后的版本中虽另,開發(fā)者也可以通過繼承NSPersistentStore類以創(chuàng)建自定義的存儲(chǔ)格式
3.好處:能夠合理管理內(nèi)存暂刘,避免使用sql的麻煩,高效
4.構(gòu)成:
(1)NSManagedObjectContext(被管理的數(shù)據(jù)上下文)操作實(shí)際內(nèi)容(操作持久層)
作用:插入數(shù)據(jù)捂刺,查詢數(shù)據(jù)谣拣,刪除數(shù)據(jù)
(2)NSManagedObjectModel(被管理的數(shù)據(jù)模型)數(shù)據(jù)庫所有表格或數(shù)據(jù)結(jié)構(gòu),包含各實(shí)體的定義信息
作用:添加實(shí)體的屬性族展,建立屬性之間的關(guān)系
操作方法:視圖編輯器森缠,或代碼
(3)NSPersistentStoreCoordinator(持久化存儲(chǔ)助理)相當(dāng)于數(shù)據(jù)庫的連接器
作用:設(shè)置數(shù)據(jù)存儲(chǔ)的名字,位置仪缸,存儲(chǔ)方式贵涵,和存儲(chǔ)時(shí)機(jī)
(4)NSManagedObject(被管理的數(shù)據(jù)記錄) 相當(dāng)于數(shù)據(jù)庫中的表格記錄
(5)NSFetchRequest(獲取數(shù)據(jù)的請(qǐng)求)相當(dāng)于查詢語句
(6)NSEntityDescription(實(shí)體結(jié)構(gòu))相當(dāng)于表格結(jié)構(gòu)
二十一,OC優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.Category是非常實(shí)用的擴(kuò)展機(jī)制恰画,可以很方便的為一個(gè)已有的類添加屬性或者方法宾茂,而不需要笨拙的去繼承。
2.運(yùn)行時(shí)多態(tài)的概念拴还,可以讓一個(gè)類的對(duì)象動(dòng)態(tài)的以其他類行為去執(zhí)行(OC中多了很多運(yùn)行時(shí)態(tài)的機(jī)制跨晴,其中id的特殊用途,可以通過id類型的變量片林,調(diào)用不同類的同名函數(shù)端盆,即使這些類沒有任何關(guān)系)。
3.ARC不用多講了吧
4.OC中成員變量也有三種訪問權(quán)限费封,@public,@protected,@private焕妙。但默認(rèn)的是@protected,而C++中默認(rèn)是private
5.OC中成員函數(shù)只有兩種弓摘,一種是實(shí)例函數(shù)访敌,一種是類函數(shù)。實(shí)例函數(shù)就是
C++中的Public函數(shù)衣盾,類函數(shù)就是public中的static函數(shù)寺旺。
6.OC中成員函數(shù)如果要接受多個(gè)參數(shù)爷抓,則需要每個(gè)參數(shù)前加冒號(hào)
7,OC還有protocol概念, 通過@protocol-@end來聲明protocol。類中通過<protocol1,protocol2,...>來表示支持某個(gè)協(xié)議阻塑。如@interface A : Object < NSCopying, NSTransform >-@end表明類A繼承與Object類蓝撇,并支持兩個(gè)協(xié)議(NSCopying, NSTransform )。
8.由于都是C衍生出的面向?qū)ο蟮恼Z言所以可以和C++混合編碼陈莽。(百度地圖API
就用到了)
缺點(diǎn):
1.不支持多重繼承
二十二渤昌,MVC設(shè)計(jì)模式是什么?你還熟悉什么模式走搁?
M:model独柑,負(fù)責(zé)儲(chǔ)存,定義私植,操作數(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)建對(duì)象瑞驱,通過靜態(tài)方法返回這個(gè)類的對(duì)象,全局唯一窄坦。
觀察者模式:一個(gè)對(duì)象改變唤反,所有的觀察者都會(huì)做出反應(yīng)。
工廠模式:工廠加工產(chǎn)品
二十三鸭津,深拷貝拴袭,淺拷貝
淺拷貝:只復(fù)制對(duì)象的指針,(如人的影子)
深拷貝:復(fù)制對(duì)象(如人的克隆體)
以對(duì)象A為例:
淺拷貝后曙博,只是復(fù)制了A的指針拥刻,出現(xiàn)一個(gè)A_淺 ,指向同一塊內(nèi)存資源父泳,修改A_淺般哼,A也會(huì)改變。
深拷貝后惠窄,復(fù)制了對(duì)象蒸眠,出現(xiàn)一個(gè)A_深,內(nèi)存中就有了2個(gè)獨(dú)立的對(duì)象杆融,一個(gè)A楞卡,一個(gè)A_深,A_深改變,A不會(huì)改變蒋腮。
二十四淘捡,#import,#include池摧,@class焦除,#import<> ,#import""
import:OC中導(dǎo)入頭文件的關(guān)鍵字,只會(huì)導(dǎo)入一次作彤,不會(huì)重復(fù)導(dǎo)入
#import<>導(dǎo)入系統(tǒng)的膘魄,#import“”導(dǎo)入非系統(tǒng)的
include:C語言導(dǎo)入頭文件的關(guān)鍵詞,會(huì)重復(fù)導(dǎo)入
@class:聲明某個(gè)類竭讳,執(zhí)行時(shí)才去查看類的實(shí)現(xiàn)文件创葡,解決頭文件的相互包含
二十五,NSString *obj = [[NSData alloc] init];編譯绢慢,運(yùn)行時(shí)分別是什么樣的類型灿渴。
編譯是NSString,運(yùn)行是NSData
二十六呐芥,OC是動(dòng)態(tài)運(yùn)行時(shí)語言是什么意思
多態(tài),主要將數(shù)據(jù)類型的確定由編譯時(shí)推遲到運(yùn)行時(shí)奋岁。
運(yùn)行時(shí)機(jī)制使我們?cè)谶\(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別思瘟,以及調(diào)用該類別對(duì)象的指定方法。
多態(tài):不同對(duì)象以自己的方式響應(yīng)同一個(gè)消息闻伶。因此滨攻,可以說運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)。
二十七蓝翰,frame和bounds有啥不同
frame光绕,參照的是父視圖,bounds畜份,參照的是自身
二十八诞帐,線程和進(jìn)程區(qū)別和聯(lián)系
1,線程和進(jìn)程都是操作系統(tǒng)運(yùn)行的基本單元爆雹,系統(tǒng)利用該基本單元實(shí)現(xiàn)并發(fā)性停蕉。
2,線程和進(jìn)程的主要差別在于他們不同的操作系統(tǒng)資源管理方式钙态。
進(jìn)程:有獨(dú)立的地址空間慧起,一個(gè)進(jìn)程崩潰,不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響册倒。
線程:是進(jìn)程中不同的執(zhí)行路徑蚓挤,有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間。一個(gè)線程死掉等于整個(gè)進(jìn)程死掉灿意。
3估灿,每個(gè)進(jìn)程之間是相互獨(dú)立的,1個(gè)進(jìn)程要想執(zhí)行任務(wù)脾歧,必須得有線程(每個(gè)進(jìn)程至少有一個(gè)線程)
線程-------》工人 進(jìn)程-------》車間
二十九甲捏,socket與http的區(qū)別
http:客戶端主動(dòng)向服務(wù)器發(fā)起http請(qǐng)求,一次連接之后立馬斷開
socket:客戶端和服務(wù)器使用“套接字”進(jìn)行連接鞭执,雙方都可以主動(dòng)發(fā)送數(shù)據(jù)司顿,一次連接之后可以保持聯(lián)通。
三十兄纺,block
1大溜,block是對(duì)象,他封裝了一段代碼估脆,這段代碼可以在任何時(shí)候執(zhí)行钦奋,
2,block可以作為函數(shù)或者函數(shù)的返回值經(jīng)常用于回調(diào)及傳值疙赠,而其本身又可以帶輸入?yún)?shù)或者返回值付材,他和傳統(tǒng)的函數(shù)指針類似,但有區(qū)別:block是inline的圃阳,并且他對(duì)局部變量是只讀的厌衔。
3,block是存在于棧中的捍岳,定義block是用copy富寿,從棧中copy到堆中。MRC下锣夹,用_ block,ARC下页徐,用 _weak .
三十一,堆和棧
1)管理方式
棧:編譯器自動(dòng)管理
堆:由程序員釋放
2)申請(qǐng)大幸肌:
棧:向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)变勇,一塊連續(xù)的內(nèi)存區(qū)域。
堆:向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)贴唇,不連續(xù)的內(nèi)存區(qū)域贰锁。
3)碎片:
棧:沒有
堆:不連續(xù),有大量的碎片
4)分配方式:
棧:靜態(tài)滤蝠,動(dòng)態(tài)兩種分配方式
堆:只有動(dòng)態(tài)分配
5)分配效率:
棧:棧是系統(tǒng)提供的豌熄,效率高
堆:C++函數(shù)庫提供的,效率低
三十二,一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會(huì)怎么處理?
答:首先我們從代碼來看物咳,數(shù)據(jù)源如何關(guān)聯(lián)上的锣险,其實(shí)是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實(shí)現(xiàn)的蹄皱。
因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上芯肤,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源巷折。
因此,我覺得可以設(shè)置多個(gè)數(shù)據(jù)源啊崖咨,但是有個(gè)問題是锻拘,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?
三十三,xib和stroyboard的區(qū)別:
一個(gè)工程中可以有多個(gè)xib文件击蹲,一個(gè)xib文件對(duì)應(yīng)著一個(gè)視圖控制器和多個(gè)視圖署拟。而使用storyboard時(shí),一個(gè)工程只需要一個(gè)主storyboard文件就可以了歌豺。因此推穷,在包含多個(gè)視圖控制器的情況下,采用storyboard管理比較方便类咧,而且storyboard還可以描述界面之間的導(dǎo)航關(guān)系馒铃。
三十四,關(guān)于自動(dòng)釋放池是什么?怎么工作?
當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池痕惋。它仍然是個(gè)正當(dāng)?shù)膶?duì)象区宇,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí)值戳,自動(dòng)釋放池就會(huì)被釋放议谷,池中的所有對(duì)象也就被釋放。
ojc-c是通過一種"referring counting"(引用計(jì)數(shù))的方式來管理內(nèi)存的,對(duì)象在開始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一,每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對(duì)象的計(jì)數(shù)變?yōu)榱?,就會(huì)被系統(tǒng)銷毀.
NSAutoreleasePool就是用來做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.
autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一.
三十五,app升級(jí)要改變數(shù)據(jù)庫結(jié)構(gòu)怎么辦?
數(shù)據(jù)庫升級(jí)流程
1.每一次運(yùn)行程序述寡,判斷數(shù)據(jù)庫是否存在柿隙。如果不存在叶洞,創(chuàng)建數(shù)據(jù)庫鲫凶。如果存在,進(jìn)行其他后續(xù)處理衩辟。
2.第一次安裝app螟炫,創(chuàng)建數(shù)據(jù)庫,并將版本號(hào)存入數(shù)據(jù)庫中艺晴。同時(shí)保存一個(gè)當(dāng)前版本號(hào)加1的字段到數(shù)據(jù)庫中昼钻。
3.更新app,從數(shù)據(jù)庫中讀取到上一次保存的版本號(hào)字段封寞。比如要升級(jí)為2然评,會(huì)直接從case2開始執(zhí)行。修改完數(shù)據(jù)結(jié)構(gòu)后狈究,再一次將版本號(hào)字段存入數(shù)據(jù)庫碗淌。
4.每一次數(shù)據(jù)庫結(jié)構(gòu)有更新,直接在后面加case語句即可。
三十六,沙盒目錄結(jié)構(gòu)
/Documents/ 保存應(yīng)用程序的重要數(shù)據(jù)文件和用戶數(shù)據(jù)文件等亿眠。iTunes 同步時(shí)會(huì)備份該目錄碎罚。
/Library/Caches 保存應(yīng)用程序使用時(shí)產(chǎn)生的支持文件和緩存文件,還有日志文件最好也放在這個(gè)目錄纳像。iTunes 同步時(shí)不會(huì)備份該目錄荆烈。
/Library/Preferences 保存應(yīng)用程序的偏好設(shè)置文件(使用 NSUserDefaults 類設(shè)置時(shí)創(chuàng)建,不應(yīng)該手動(dòng)創(chuàng)建)竟趾。
/tmp/ 保存應(yīng)用運(yùn)行時(shí)所需要的臨時(shí)數(shù)據(jù)憔购,iphone 重啟時(shí),會(huì)清除該目錄下所有文件潭兽。
三十七,單例模式
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];
}