簡(jiǎn)述OC中內(nèi)存管理機(jī)制怀泊。與retain配對(duì)使用的方法是dealloc還是release,為什么误趴?需要與alloc配對(duì)使用的方法是dealloc還是release霹琼,為什么?readwrite,readonly枣申,assign售葡,retain,copy忠藤,nonatomic 挟伙、atomic、strong模孩、weak像寒、unsafe_unretained屬性的作用?
OC使用了一種叫做引用計(jì)數(shù)的機(jī)制來(lái)管理對(duì)象瓜贾,如果對(duì)一個(gè)對(duì)象使用了alloc诺祸、[Mutable]copy,retain祭芦,那么你必須使用相應(yīng)的realease或者autorelease筷笨。也可以理解為自己生成的對(duì)象,自己持有龟劲。非自己生成的對(duì)象胃夏,自己也能持有。不在需要自己持有的對(duì)象時(shí)釋放昌跌。非自己持有的對(duì)象無(wú)法釋放仰禀。生成并持有對(duì)象,持有對(duì)象蚕愤,釋放對(duì)象,廢棄對(duì)象;
readwrite(默認(rèn)):可讀可寫答恶,表示既有g(shù)etter方法,也有setter方法;
readonly:表示只有g(shù)etter方法萍诱,沒(méi)有setter方法;
nonatomic:不考慮線程安全;
atomic(默認(rèn)):線程操作安全;
strong(默認(rèn)):ARC下和MRC下retain一樣;
weak(ARC下):和(MRC下)assign類似悬嗓,區(qū)別是當(dāng)weak指向的內(nèi)存釋放掉后自動(dòng)置為nil,防止野指針裕坊。
unsafe_unretained聲明一個(gè)弱引用包竹,但不會(huì)自動(dòng)置為nil,可能會(huì)出現(xiàn)野指針籍凝。
線程安全下的setter和getter方法:
-(NSString *)value
{
@synchronized(self){
return [[_value retain] autorelease];
}
}
-(void)setValue:(NSString *)aValue
{
@synchronized(self){
[aValue retain];//新對(duì)象先retain
[_value release];//釋放舊對(duì)象
_value = aValue;//對(duì)象賦值
}
}
類變量的@protected ,@private,@public,@package周瞎,聲明各有什么含義?
上面的幾個(gè)聲明表明的時(shí)類成員的作用域;
@private作用范圍只能在自身類(外界既不可訪問(wèn)饵蒂,又不能繼承)声诸;@protected作用范圍在自身類和子類,如果什么都不加修飾【默認(rèn)】苹享,(外界不可訪問(wèn)双絮,但是可以繼承)浴麻;
@public作用范圍最大,可以在任何地方被訪問(wèn)(外界即可訪問(wèn)囤攀,又可以繼承)软免;
@package作用范圍在某個(gè)框架內(nèi)
線程是什么?進(jìn)程是什么焚挠?二者有什么區(qū)別和聯(lián)系膏萧?
線程是CPU獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位(可以理解為一個(gè)進(jìn)程中執(zhí)行的代碼片段),進(jìn)程是資源分配的基本單位(進(jìn)程是一塊包含了某些資源的內(nèi)存區(qū)域)蝌衔。進(jìn)程是線程的容器榛泛,真正完成代碼執(zhí)行的是線程,而進(jìn)程則作為線程的執(zhí)行環(huán)境噩斟。一個(gè)程序至少包含一個(gè)進(jìn)程曹锨,一個(gè)進(jìn)程至少包含一個(gè)線程,一個(gè)進(jìn)程中的多個(gè)線程共享當(dāng)前進(jìn)程所擁有的資源剃允。
談?wù)勀銓?duì)多線程開發(fā)的理解沛简?iOS中有幾種實(shí)現(xiàn)多線程的方法?
好處:
1斥废、使用線程可以把程序中占據(jù)時(shí)間長(zhǎng)的任務(wù)放到后臺(tái)去處理椒楣,如圖片、視頻的下載
2牡肉、發(fā)揮多核處理器的優(yōu)勢(shì)捧灰,并發(fā)執(zhí)行讓系統(tǒng)運(yùn)行的更快、更流暢统锤,用戶體驗(yàn)更好
缺點(diǎn):
1毛俏、大量的線程降低代碼的可讀性,
2跪另、更多的線程需要更多的內(nèi)存空間
3拧抖、當(dāng)多個(gè)線程對(duì)同一個(gè)資源出現(xiàn)爭(zhēng)奪的時(shí)候要注意線程安全的問(wèn)題。
iOS有三種多線程編程的技術(shù):
//NSThread(兩種創(chuàng)建方式)
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[myThread start];
//NSOperationQueue
NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];
oprationQueue addOperationWithBlock:^{
//這個(gè)block語(yǔ)句塊在子線程中執(zhí)行
}
//Grand Central Dispatch (GCD)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗時(shí)的操作
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
PS:不顯式的創(chuàng)建線程的方法:
用NSObject的類方法 performSelectorInBackground:withObject: 創(chuàng)建一個(gè)線程:
[obj performSelectorInBackground:@selector(doSomething) withObject:nil];
線程同步和異步的區(qū)別免绿?iOS中如何實(shí)現(xiàn)多線程的同步?
同步:一個(gè)線程要等待上一個(gè)線程執(zhí)行完之后才能執(zhí)行當(dāng)前的線程擦盾,生活中的例子(上廁所)嘲驾。
異步:同時(shí)去做兩件或者多件事。比如邊聽歌邊看報(bào)迹卢。
原子操作(atomic)辽故、加鎖(NSLock、NSRecursive腐碱、NSConditionLock)誊垢、@synchronized
GCD串行隊(duì)列,GCD當(dāng)中的屏障,NSOperationQueue設(shè)置最大并發(fā)數(shù)為maxConcurrentOperationCount = 1
獲取一臺(tái)設(shè)備唯一標(biāo)識(shí)的方法有哪些掉弛?
MAC地址,udid喂走,keychain殃饿,open udid,廣告標(biāo)識(shí)IDFA-identifierForIdentifier
iOS類是否可以多繼承?如果沒(méi)有芋肠,那可以用其他方法實(shí)現(xiàn)嗎乎芳?簡(jiǎn)述實(shí)現(xiàn)過(guò)程
不可以,可以通過(guò)消息轉(zhuǎn)發(fā)帖池、delegate和protocol和類別來(lái)實(shí)現(xiàn)類似多繼承
堆和棧的區(qū)別奈惑?
棧區(qū)(stack)--由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值睡汹、局部變量的值肴甸。
堆區(qū)(heap)--一般由程序員分配釋放。
全局區(qū)(靜態(tài)區(qū))(static)--全局變量和靜態(tài)變量囚巴。程序結(jié)束后由系統(tǒng)釋放雷滋。
文字常量區(qū)--常量字符串存放在這里。程序結(jié)束后由系統(tǒng)釋放文兢。
程序代碼區(qū)—存放函數(shù)體的二進(jìn)制文件晤斩。
棧:只要棧的剩余空間大于所申請(qǐng)空間,系統(tǒng)將為程序提供內(nèi)存姆坚,否則將報(bào)異常提示棧溢 出澳泵。
堆:首先應(yīng)該知道操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請(qǐng)時(shí)兼呵,會(huì)遍歷該鏈表兔辅,尋找第一個(gè)空間大于所申請(qǐng)空間的堆結(jié)點(diǎn),然后將該結(jié)點(diǎn)從空閑結(jié)點(diǎn)鏈表中刪除击喂,并將該結(jié)點(diǎn)的空間分配給程序维苔,另外,對(duì)于大多數(shù)系統(tǒng)懂昂,會(huì)在這塊內(nèi)存空間中的首地址處記錄本次分配的大小介时,這樣,代碼中的delete語(yǔ)句才能正確的釋放本內(nèi)存空間凌彬。另外沸柔,由于找到的堆結(jié)點(diǎn)的大小不一定正好等于申請(qǐng)的大小,系統(tǒng)會(huì)自動(dòng)的將多余的那部分重新放入空閑鏈表中铲敛。
iOS本地?cái)?shù)據(jù)存儲(chǔ)都有哪幾種方式褐澎?iOS如何實(shí)現(xiàn)復(fù)雜對(duì)象的存儲(chǔ)?
NSKeyedArchiver(歸檔)采用歸檔的形式來(lái)保存數(shù)據(jù)伐蒋,該數(shù)據(jù)對(duì)象需要遵守NSCoding協(xié)議工三,并且該對(duì)象對(duì)應(yīng)的類必須提供encodeWithCoder:和initWithCoder:方法;
NSUserDefaults:用來(lái)保存應(yīng)用程序設(shè)置和屬性迁酸、用戶保存的數(shù)據(jù)。用戶再次打開程序或開機(jī)后這些數(shù)據(jù)仍然存在俭正。NSUserDefaults可以存儲(chǔ)的數(shù)據(jù)類型包括:NSData奸鬓、NSString、NSNumber段审、NSDate全蝶、NSArray、NSDictionary;
Write寫入方式:永久保存在磁盤中;
SQLite(FMDB寺枉、CoreData) ;
NSCoding + NSKeyedArchiver實(shí)現(xiàn)復(fù)雜對(duì)象的存儲(chǔ);
iOS的動(dòng)態(tài)性
iOS的動(dòng)態(tài)性來(lái)自三個(gè)方面:動(dòng)態(tài)類型抑淫、動(dòng)態(tài)綁定、動(dòng)態(tài)載入姥闪、SEL類型
1始苇、動(dòng)態(tài)類型<弱類型>(id):在代碼的運(yùn)行階段判斷代碼的類型,使用id類型可以讓應(yīng)用在“運(yùn)行時(shí)”使用任何類型來(lái)替換筐喳。動(dòng)態(tài)類型讓程序更加靈活催式,但是會(huì)使數(shù)據(jù)的統(tǒng)一性降低和代碼的可讀性。我們常用靜態(tài)類型<強(qiáng)類型>(如NSString),使用靜態(tài)類型編譯器可以完全分析你的代碼避归,這讓代碼的性能和可預(yù)知性更高荣月。
2、動(dòng)態(tài)綁定:讓代碼在運(yùn)行時(shí)判斷需要調(diào)用什么方法梳毙,而不是在編譯時(shí)哺窄。動(dòng)態(tài)類型和動(dòng)態(tài)綁定使得選擇哪個(gè)接收者已經(jīng)調(diào)用什么方法都放到運(yùn)行時(shí)去完成。
3账锹、動(dòng)態(tài)載入:應(yīng)用程序可以根據(jù)需要加載可執(zhí)行代碼以及資源萌业,而不是 在啟動(dòng)時(shí)就加載所有資源。
4奸柬、SEL類型 iOS在編譯的時(shí)候會(huì)根據(jù)方法的名字(包括參數(shù)序列)生年,生成一個(gè)用來(lái)區(qū)分這個(gè)方法的唯一的ID,這個(gè)ID是SEL類型的廓奕,SEL的本質(zhì)就是類方法的編號(hào)[函數(shù)地址]抱婉。(類似C語(yǔ)言里面的函數(shù)指針,但是OC的類不能直接使用函數(shù)指針懂从,這樣只能做一個(gè)@selector語(yǔ)法來(lái)取授段。注意:@selector是查找當(dāng)前類(含子類)的方法。)
深拷貝和淺拷貝的理解番甩?
深拷貝拷貝的是內(nèi)容,淺拷貝拷貝的是指針届搁。深拷貝和淺拷貝最大的區(qū)別就是子類對(duì)象的地址是否改變缘薛,如果子類對(duì)象的地址改變那么就是深拷貝窍育。
怎樣實(shí)現(xiàn)一個(gè)singleton的類?
static SingletonSample * instance;
+( SingletonSample *)sharedInstance{
@synchronized(self){//這個(gè)東西其實(shí)就是 一個(gè)加鎖。如果self 其他線程訪問(wèn)宴胧,則會(huì)阻塞漱抓。這樣做一般是用來(lái)對(duì)單例 進(jìn)行一個(gè)死鎖的保護(hù)
if (!instance) {
instance = [[super allocWithZone:NULL] init];
}
}
return instance;
}
//第二種方式
+ (SingletonSample *) sharedInstance
{
static SingletonSample *instance;
static dispatch_once_t onceToken; // 鎖
dispatch_once (& onceToken, ^ { // 最多調(diào)用一次,
instance = [[self alloc] init];
});
return instance;
}
RunLoop是什么?
一個(gè)RunLoop就是一個(gè)時(shí)間處理的循環(huán)恕齐,用來(lái)不停的調(diào)度工作以及處理輸入時(shí)間乞娄。使用runloop的目的是讓你的線程在有工作的時(shí)候忙于工作,而沒(méi)工作的時(shí)候處于休眠狀態(tài)。runloop的設(shè)計(jì)是為了減少cpu無(wú)謂的空轉(zhuǎn);
簡(jiǎn)述應(yīng)用程序按Home鍵進(jìn)入后臺(tái)時(shí)的生命周期显歧,以及從后臺(tái)回到前臺(tái)時(shí)的生命周期仪或?
應(yīng)用程序的狀態(tài):
Not running 未運(yùn)行,程序沒(méi)啟動(dòng)
Inactive 未激活士骤,程序在前臺(tái)運(yùn)行范删,不過(guò)沒(méi)接受到事件,沒(méi)有事件處理的狀態(tài)下通常處于這個(gè)狀態(tài)拷肌。
Active 激活 程序在前臺(tái)并且接收到了事件
Backgound 后臺(tái) 程序在后臺(tái)而且能執(zhí)行代碼到旦,大多數(shù)程序進(jìn)入這個(gè)狀態(tài)后會(huì)在在這個(gè)狀態(tài)上停留一會(huì)。
Suspended 掛起 程序在后臺(tái)不能執(zhí)行代碼巨缘。
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//告訴代理進(jìn)程啟動(dòng)但還沒(méi)進(jìn)入狀態(tài)保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// 告訴代理啟動(dòng)基本完成程序準(zhǔn)備開始運(yùn)行
- (void)applicationWillResignActive:(UIApplication *)application
// 當(dāng)應(yīng)用程序?qū)⒁敕腔顒?dòng)狀態(tài)執(zhí)行添忘,在此期間,應(yīng)用程序不接收消息或事件若锁,比如來(lái)電話了
- (void)applicationDidBecomeActive:(UIApplication *)application
// 當(dāng)應(yīng)用程序入活動(dòng)狀態(tài)執(zhí)行搁骑,這個(gè)剛好跟上面那個(gè)方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
// 當(dāng)程序被推送到后臺(tái)的時(shí)候調(diào)用。所以要設(shè)置后臺(tái)繼續(xù)運(yùn)行拴清,則在這個(gè)函數(shù)里面設(shè)置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
//當(dāng)程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用靶病,這個(gè)剛好跟上面的那個(gè)方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
//當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用口予,通常是用來(lái)保存數(shù)據(jù)和一些退出前的清理工作娄周。這個(gè)需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
//當(dāng)程序載入后執(zhí)行
描述應(yīng)用程序的啟動(dòng)順序沪停?
1煤辨、程序入口main函數(shù)創(chuàng)建UIApplication實(shí)例和UIApplication代理實(shí)例
2、在UIApplication代理實(shí)例中重寫啟動(dòng)方法木张,設(shè)置第一ViewController
3众辨、在第一ViewController中添加控件,實(shí)現(xiàn)對(duì)應(yīng)的程序界面舷礼。
為什么很多內(nèi)置類如UITableViewControl的delegate屬性都是assign而不是retain鹃彻?請(qǐng)舉例
防止循環(huán)引用,
Student * str=[];
Teacher *teacher=[[Teacher alloc] init];
Student * student=[[Student alloc] init];
teacher.delegate=student;
student.delegate= teacher;
在teacher中dealloc會(huì)release當(dāng)前的Delegate妻献,就會(huì)觸發(fā)student對(duì)象release蛛株,繼而也會(huì)導(dǎo)致student執(zhí)行dealloc团赁,在student中也會(huì)release自己的delegate,產(chǎn)生循環(huán)了谨履。
簡(jiǎn)述你對(duì)UIView欢摄、UIWindow和CALayer的理解?
UIView繼承于UIResponder, UIResponder繼承于NSObject,UIView可以響應(yīng)用戶事件笋粟。CALayer繼承于NSObject怀挠,所以CALayer不能響應(yīng)事件;
UIView構(gòu)建界面,UIView側(cè)重于對(duì)內(nèi)容的管理害捕,CALayer側(cè)重于對(duì)內(nèi)容的繪制绿淋。
UIView是用來(lái)顯示內(nèi)容的,可以處理用戶事件吨艇;CALayer是用來(lái)繪制內(nèi)容的躬它,對(duì)內(nèi)容進(jìn)行動(dòng)畫處理,依賴與UIView來(lái)進(jìn)行顯示东涡,不能處理用戶事件冯吓;
簡(jiǎn)述NotificationCenter、KVC疮跑、KVO组贺、Delegate?并說(shuō)明它們之間的區(qū)別祖娘?
Notification:觀察者模式失尖,controller向defaultNotificationCenter添加自己的 notification,其他類注冊(cè)這個(gè)notification就可以收到通知渐苏,這些類可以在收到通知時(shí)做自己的操作(多觀察者默認(rèn)隨機(jī)順序發(fā)通知給 觀察者們掀潮,而且每個(gè)觀察者都要等當(dāng)前的某個(gè)觀察者的操作做完才能輪到他來(lái)操作,可以用NotificationQueue的方式安排觀察者的反應(yīng)順序琼富,也 可以在添加觀察者中設(shè)定反映時(shí)間仪吧,取消觀察需要在viewDidUnload 跟dealloc中都要注銷);
KVC鍵值編碼,可以直接通過(guò)字符串的名字(key)來(lái)間接訪問(wèn)屬性的機(jī)制鞠眉,而不是通過(guò)調(diào)用getter和setter方法訪問(wèn);
KVO:觀測(cè)指定對(duì)象的屬性薯鼠,當(dāng)指定對(duì)象的屬性更改之后會(huì)通知相應(yīng)的觀察者;
delegate:一對(duì)一,delegate遵循某個(gè)協(xié)議并實(shí)現(xiàn)協(xié)議聲明的方法;
分別描述類別(categories)和延展(extensions)是什么械蹋?以及兩者的區(qū)別出皇?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?為什么Category只能為對(duì)象添加方法哗戈,卻不能添加成員變量郊艘?
category類目:在不知道源碼的情況下為一個(gè)類擴(kuò)展方法,extension:為一個(gè)類聲明私有方法和變量。
繼承是創(chuàng)建了一個(gè)新的類暇仲,而類別只是對(duì)類的一個(gè)擴(kuò)展步做,還是之前的類副渴。
類目的作用就是為已知的類添加方法;
談?wù)勀銓?duì)MVC的理解奈附?為什么要用MVC?在Cocoa中MVC是怎么實(shí)現(xiàn)的煮剧?你還熟悉其他的OC設(shè)計(jì)模式或別的設(shè)計(jì)模式嗎斥滤?
MVC是Model-VIew-Controller,就是模型-視圖-控制器, MVC把軟件系統(tǒng)分為三個(gè)部分:Model勉盅,View佑颇,Controller。
Cocoa中所有的控件草娜、窗口等都繼承自 UIView挑胸,對(duì)應(yīng)MVC中的 V。UIView及其子類主要負(fù)責(zé)UI的實(shí)現(xiàn)宰闰,而UIView所產(chǎn)生的事件都可以采用委托的方式茬贵,交給UIViewController實(shí)現(xiàn)。對(duì)于不同的 UIView移袍,都有相應(yīng)的UIViewController 對(duì)應(yīng)MVC中的C解藻。比如在iPhone OS上常用的UITableView,它所對(duì)應(yīng)的Controller就是UITableViewController葡盗。至于MVC中的M螟左,那需要根據(jù)用 戶自己的需求來(lái)實(shí)現(xiàn)了。
MVC可以幫助確保幫助實(shí)現(xiàn)程序最大程度的可重用性觅够。各MVC元素彼此獨(dú)立運(yùn)作胶背,通過(guò)分開這些元素,可以構(gòu)建可維護(hù)喘先,可獨(dú)立更新的程序組建钳吟。
單例模式,delegate設(shè)計(jì)模式苹祟,target-action設(shè)計(jì)模式砸抛,觀察者模式,MVVM
說(shuō)說(shuō)響應(yīng)鏈
當(dāng)事件發(fā)生的時(shí)候树枫,響應(yīng)鏈?zhǔn)紫缺话l(fā)送給第一個(gè)響應(yīng)者(往往是事件發(fā)生的視圖直焙,也就是用戶觸摸屏幕的地方)。事件將沿著響應(yīng)者鏈一直向下傳遞砂轻,直到被接受并作出處理奔誓。一般來(lái)說(shuō),第一響應(yīng)這是個(gè)視圖對(duì)象或者其子類,當(dāng)其被觸摸后事件就交由它處理厨喂,如果他不處理和措,時(shí)間就會(huì)被傳遞給視圖控制器對(duì)象;
UIViewController(如果存在),然后是它的父視圖對(duì)象(superview)蜕煌,以此類推知道頂層視圖派阱。接下來(lái)會(huì)沿著頂層視圖(top view)到窗口(UIwindow 對(duì)象) 再到程序的(UIApplication對(duì)象),如果整個(gè)過(guò)程都沒(méi)有響應(yīng)這個(gè)事件斜纪,則該事件被丟棄贫母,一般情況下,在響應(yīng)鏈中只要有對(duì)象處理事件盒刚,事件就會(huì)被傳遞 ;
典型的響應(yīng)路線圖如: First Responser --> The Window -->The Applicationn --> App Delegate
什么是沙盒(sandbox)腺劣?沙盒包含哪些文件,描述每個(gè)文件的使用場(chǎng)景因块。如何獲取這些文件的路徑橘原?如何獲取應(yīng)用程序包中文件的路徑势木?
iOS應(yīng)用程序只能在為該改程序創(chuàng)建的文件系統(tǒng)中讀取文件申尤,不可以去其它地方訪問(wèn),此區(qū)域被成為沙盒圃庭,所以所有的非代碼文件都要保存在此吓懈,例如圖像歼冰,圖標(biāo),聲音耻警,映像隔嫡,屬性列表,文本文件等甘穿。
默認(rèn)情況下腮恩,每個(gè)沙盒含有3個(gè)文件夾:Documents, Library 和 tmp。
Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下温兼,iTunes備份和恢復(fù)的時(shí)候會(huì)包括此目錄
Library:存儲(chǔ)程序的默認(rèn)設(shè)置或其它狀態(tài)信息秸滴;
Library/Caches:存放緩存文件,iTunes不會(huì)備份此目錄募判,此目錄下文件不會(huì)在應(yīng)用退出刪除
tmp:提供一個(gè)即時(shí)創(chuàng)建臨時(shí)文件的地方荡含。
iTunes在與iPhone同步時(shí),備份所有的Documents和Library文件届垫。iPhone在重啟時(shí)释液,會(huì)丟棄所有的tmp文件!
談?wù)剬?duì)性能優(yōu)化的看法,如何做装处?
從用戶體驗(yàn)出發(fā):
1误债、程序logging不要太長(zhǎng)、
2、相同數(shù)據(jù)不做重復(fù)獲取寝蹈、
3李命、昂貴資源要重用(cell、sqlite箫老、date)封字,
4、良好的編程習(xí)慣和程序設(shè)計(jì):選擇正確的集合對(duì)象和算法來(lái)進(jìn)行編程槽惫、選擇適合的數(shù)據(jù)存儲(chǔ)格式(plist周叮、SQLite)、優(yōu)化SQLite查詢語(yǔ)句
5界斜、數(shù)據(jù)資源方面的優(yōu)化(緩存和異步加載)
解決方案:
? 能夠發(fā)現(xiàn)問(wèn)題
? 利用log或工具分析問(wèn)題原因
? 假設(shè)問(wèn)題原因
? 改進(jìn)代碼和設(shè)計(jì)