版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
iOS程序員面試分類模擬25簡答題1.
isKindOfClass和isMemberOfClass有什么區(qū)別與聯(lián)系?正確答案:isKindOfClass和isMemberOfClass都是Obje(江南博哥)ctive-C語言的內(nèi)省特性方法,用于實現(xiàn)動態(tài)類型識別(判斷某個對象是否屬于某個動態(tài)類型)。但兩者的類型判定深度不同。
isKindOfClass的判“真”要求相對寬松,它是判斷某個對象是否是Class類型的實例或其子類的實例。
isMemberOfClass的判“真”要求相對更高,比isKindOfClass嚴格的是,isMemberOfClass只判斷某個對象是否是Class類型的實例,不放寬到其子類。
例如:Dog類繼承自Animal類,對于一個Dog類型的實例對象dog,[dogisKindOfClass:[Animalclass]]為真,而[dogisMemberOfClass:[Animalclass]]為假。
/*Dog類繼承自父類Animal*/
Dog*dog=[[Dogalloc]init];
[dogisKindOfClass:[Dogclass]];
//true
[dogisKindOfClass:[Animalclass]];
//true
[dogisMemberOfClass:[Dogclass]];//true
[dogisMemberOfClass:[Animalclass]];//false
2.
contentsScale屬性有什么作用?正確答案:圖層的contentsScale屬性屬于支持高分辨率屏幕(如Retina屏幕)機制的一部分,它定義了圖層content中圖像的像素尺寸與視圖大小的比例。它也被用來判斷在繪制圖層時允許為content屬性創(chuàng)建的空間大小,以及需要顯示的圖片的拉伸度。
默認情況下,contentsScale的值是1.0,也就是說圖層的繪制系統(tǒng)將會以每個點對應(yīng)一個像素來繪制圖片。如果將其設(shè)置為2.0,那么會以每個點對應(yīng)兩個像素來繪制圖片,此即所謂的Retina屏幕。
在開發(fā)中,有時會直接為圖層的content設(shè)置圖片,這時可以設(shè)置contentsScale為合適的值,以防止圖片在Retina屏幕上顯示不正確(像素化或模糊),代碼如下:
layer.contentsScale=[UIScreenmainScreen].scale;
3.
在Objective-C中,前置運算和后置運算有什么區(qū)別?正確答案:Objective-C支持大部分標準C語言的運算符,其中包含的前置運算符和后置運算符有:++、+、--、-。以++操作為例,對于變量a,當(dāng)單獨使用++a和a++時,它們是沒有任何區(qū)別的,都是變量a的自增運算。當(dāng)涉及表達式運算時,這兩種情況的計算過程有明顯的差別,示例代碼如下。
方式一:
inta=10;
++a;//a=11
方式二:
inta=10;
a++;//a=11
方式三:
intb;
inta=10;
b=++a;//a=11,b=11
方式四:
intb;
inta=10;
b=a++;//a=11,b=10
對于方式一和方式二兩段代碼,其結(jié)果是一樣的,其效果都是讓a的值+1,最后a的值都為11。而方式三和方式四兩段代碼的執(zhí)行結(jié)果是有明顯區(qū)別的。方式三代碼的作用是先對a執(zhí)行+1的操作,再將a的值賦值給b。因此,最后a和b的值都是11。方式四代碼的作用是先將a的值復(fù)制一份寄存,然后對a執(zhí)行+1的操作,于是a變成11,但是復(fù)制出來的值還是10,a++運算完畢后,再將復(fù)制出來的值10賦值給b,所以最后變量b的值是10,而變量a的值是11。
總而言之,后置的++運算符是先將變量的值返回,然后自增1;而前置的++運算符,則是先將值自增1,再返回其值。
4.
Objective-C中的屬性和實例變量有哪些區(qū)別?正確答案:從下面的代碼中可以很明顯地看出它們的區(qū)別:
@interfaceTest:NSObject{
/*實例變量*/
@private
NSString*major;
@public
intage;
}
/*屬性變量*/
@property(nonatomic,copy)NSString*name;
@end
Objective-C中的屬性主要是對傳統(tǒng)實例變量的封裝,類對象有一個屬性列表用來存放類的所有屬性。屬性和實例變量的區(qū)別主要有以下幾個方面的內(nèi)容:
1)實例變量的存放采用硬編碼,編譯后寫死,根據(jù)距起始地址的偏移量來訪問變量,不可再插入新變量,而屬性可以在運行時動態(tài)添加刪除。
2)實例變量可以通過@prirate、@public和@protected等修飾詞來定義變量的作用域,限制變量的訪問權(quán)限,而屬性不可以。從設(shè)計角度,屬性主要是用來和外部類進行訪問交互的,實例變量主要用于類內(nèi)部使用。
3)屬性可以通過三類屬性特質(zhì)分別來幫助內(nèi)存管理、多線程管理和讀寫控制,可以讓編譯器自動合成存取方法,而不用重復(fù)為每一個實例變量手寫存取方法造成代碼臃腫。
5.
viewDidLoad和viewDidAppear的區(qū)別是什么?正確答案:當(dāng)界面第一次從xib文件或者storyboard加載界面,或者手寫代碼創(chuàng)建窗口從loadView加載界面時,才會調(diào)用viewDidLoad回調(diào)方法,而viewDidAppear方法在每次界面出現(xiàn)時都會調(diào)用,包括第一次加載,或者跳轉(zhuǎn)離開后又跳轉(zhuǎn)回來時。
從服務(wù)器加載數(shù)據(jù)的代碼寫在何處取決于具體需求,如果所用的數(shù)據(jù)在第一次加載后便不會再改變,那么可以在viewDidLoad中進行請求。如果界面加載后服務(wù)器數(shù)據(jù)可能會變,又必須保證當(dāng)前界面的數(shù)據(jù)是最新的,那么當(dāng)重新回到界面時就要重新加載最新數(shù)據(jù),應(yīng)該將數(shù)據(jù)請求代碼寫在viewDidAppear回調(diào)方法中。
6.
在Objective-C中,與alloe語義相反的方法是dealloc還是release?正確答案:alloc與dealloc語意相反,alloc是創(chuàng)建變量,dealloc是釋放變量。
retain與release語義相反,retain保留一個對象,調(diào)用后使變量的引用計數(shù)加1,而release釋放一個對象,調(diào)用后使變量的引用計數(shù)減1。
雖然alloc對應(yīng)dealloc,retain對應(yīng)release,但是與alloc配對使用的方法是release,而不是dealloc。為什么呢?這要從它們的實際效果來看。事實上alloc和release配對使用只是表象,本質(zhì)上還是retain和release的配對使用。alloc用來創(chuàng)建對象,剛創(chuàng)建的對象默認引用計數(shù)為1,相當(dāng)于調(diào)用alloc創(chuàng)建對象過程中同時會調(diào)用一次retain使對象引用計數(shù)加1,自然要有對應(yīng)的release的一次調(diào)用,使對象不再被用時能夠被釋放掉防止內(nèi)存泄漏。
此外,dealloc是在對象引用計數(shù)為0以后系統(tǒng)自動調(diào)用的,dealloc沒有使對象引用計數(shù)減1的作用,只是在對象引用計數(shù)為0后被系統(tǒng)調(diào)用進行內(nèi)存回收的收尾工作。
7.
什么是ReactiveCocoa?如何使用?正確答案:ReactiveCocoa是GitHub開源的應(yīng)用于iOS和OSX的FRP框架,它吸取了.Net的ReactiveExtensions的設(shè)計,并實現(xiàn)了Objective-C和Swift兩個版本。
ReactiveCocoa的宗旨是Streamsofvaluesovertime(隨著時間變化而不斷流動的數(shù)據(jù)流)。它的主要目的是想解決Controller過于臃腫的問題,狀態(tài)及狀態(tài)之間的轉(zhuǎn)化問題,數(shù)據(jù)和事件的綁定問題以及消息傳遞的問題。RAC中把事件、變量等都看作信號,而信號就對應(yīng)了FRP中的流,當(dāng)信號被訂閱(subscribing)時,信號的執(zhí)行才會被觸發(fā)。
下圖是事件和變量隨時間的流動圖。
事件和變量隨時間的流動圖
下面簡單地介紹RAC的使用。示例代碼如下:
/*1.1創(chuàng)建一個信號,并訂閱它*/
RACSignal*signal=[RACSignalcreateSignal:^RACDisposable*_Nullable(id<RACSubscriber>_Nonnullsubscriber){
inta=0:
[subscribersendNext:@(a)];
[subscribersendCompleted];
returnnil;
}];
/*訂閱信號signal*/
[signalsubscribeNext:^(id_Nullablex){
NSLog(@"x:%@",x);
}];
/*1.2監(jiān)聽一個UITextField屬性text的變化,并打印text的值*/
[self.textField.rac_textSignalsubscribeNext:^(NSString*text){
NSLog(@"text:%@",text);
}];
/*1.3使用filter過濾UITextField中text長度小于6的字符串*/
[[self.textField.rac_textSignalfilter:^BOOL(NSString*_Nullablevalue){
returnvalue.length>6;
}]subscribeNext:^(NSString*text){
NSLog(@"textvalue:%@",text);
}];
/*1.4通過map重新映射的信號持有的變量,實現(xiàn)獲取UITextField中text的長度*/
RACSignal*textLengthSignal=[self.textField.rac_textSignalmap:^id_Nullable(NSString*value){
return@(value.length);
}];
[textLengthSignalsubscribeNext:^(NSNumber*length){
NSLog(@"textlength:%d",[lengthintValue]);
}];
/*1.5使用signalForControlEvents代替addTarget實現(xiàn)事件綁定*/
[[self.buttonrac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(__kindofUIControl*_Nullablex){
//dosomething...
VSCog(@"buttonclick");
}];
/*1.6將某個對象的text屬性綁定到UITextField的text上*/
RAC(self.model,text)=self.textField.rac_textSignal;
/*1.7RAC遍歷數(shù)組元素*/
NSArray*numbers=@[@1,@2,@3,@4];
[numbers.rac_sequence.signalsubscribeNext:^(idx){
NSLog(@"%@",x);
}];
RAC的強大遠遠不止如此,可以用它來封裝網(wǎng)絡(luò)請求,從而幫助Controller減少網(wǎng)絡(luò)請求的邏輯。開發(fā)人員還可以用RAC重新實現(xiàn)MVVM模式,通過RAC實現(xiàn)模型與數(shù)據(jù)的綁定。如果你是一個有追求的程序員,想更加深入學(xué)習(xí)RAC,那么請到它的官網(wǎng)或者相關(guān)博客中學(xué)習(xí)。
8.
所謂的Objective-C是動態(tài)運行時語言是什么意思?正確答案:Objective-C是動態(tài)運行時語言主要指Objective-C語言的動態(tài)性,包括動態(tài)性和多態(tài)性兩個方面。
動態(tài)性即Objective-C的動態(tài)類型、動態(tài)綁定和動態(tài)加載特性,將對象類型的確定、方法調(diào)用的確定、代碼和資源的裝載等推遲到運行時進行,更加靈活。
多態(tài)是面向?qū)ο笞兂烧Z言的特性,Objective-C作為一門面向?qū)ο蟮恼Z言,自然具備這種多態(tài)性。多態(tài)性指來自不同類的對象可以接收同一消息的能力,或者說不同對象以自己的方式響應(yīng)相同的消息的能力。
9.
什么是隱式動畫和顯式動畫?正確答案:隱式動畫是UIKit動畫的基礎(chǔ),是iOS中創(chuàng)建動態(tài)UI界面的最直接的一種方式。開發(fā)者通過直接設(shè)定UI元素的一些可見屬性的目標值,如frame、bounds、center、transform、alpha、backgroundColor、contentStretch等,即可自動生成屬性變化的過渡動畫。例如,設(shè)置視圖的目標位置為P1,即可自動生成從視圖當(dāng)前位置移動到P1的平滑動畫。隱式動畫是一種默認動畫,動畫是線性的,可以滿足基本的需求,但對于一些復(fù)雜的動畫,如讓視圖沿曲線移動,隱式動畫就無能為力了,需要定義顯式動畫來實現(xiàn)。
例如,假設(shè)視圖view位于屏幕外,通過執(zhí)行下面的隱式動畫,view可以平滑地移入當(dāng)前視圖中央,動畫時間為0.5s,動畫結(jié)束時則回調(diào)可以緊接著進行其他的操作,如繼續(xù)進行下一個動畫等。
/*隱式動畫,視圖平滑移入當(dāng)前視圖中央*/
[UIViewanimateWithDuration:0.5animations:^{
view.center=self.view.center;
}completion:^(BOOLfinished){
//動畫結(jié)束回調(diào)...
}];
顯式動畫不像隱式動畫那樣默認從一個初始狀態(tài)線性變化到目標狀態(tài),而是需要顯式地定義完整的動畫流程,這樣略微復(fù)雜的同時會更加靈活,可以實現(xiàn)更加復(fù)雜的動畫效果。例如,隱式動畫只能實現(xiàn)直線平移效果,而顯式動畫可以顯式地定義任意的曲線路徑,讓視圖沿著曲線移動。簡單來說,顯式動畫就是要顯式地定義動畫對象,設(shè)置動畫對象的各個狀態(tài)和值,然后將動畫對象應(yīng)用到視圖上,即可呈現(xiàn)動畫的效果。
例如,下面定義一個在x和y軸方向上(二維平面)不斷縮放的動畫對緣,動畫使視圖層先放大1.2倍,動畫結(jié)束后回到初始狀態(tài),如此循環(huán)。應(yīng)用的時候?qū)⒃搫赢媽ο筇砑拥綄?yīng)視圖的layer層上即可。
/*定義基本動畫對象(縮放動畫)*/
CABasicAnimation*animation=[CABasicAnimationanimationWithKeyPath:@"transformPath"];
/*設(shè)置動畫目標狀態(tài),xy平面放大1.2倍*/
CATransform3DscaleTransform=CATransform3DMakeScale(1.2,1.2,1);
animation.toValue=[NSValuevalueWithCATransform3D:scaleTransform];
/*動畫持續(xù)時間0.5s*/
animation.duration=0.5;
/*動畫不斷循環(huán)重復(fù)*/
animation.repeatCount=HUGE_VALF;
/*自動逆動畫*/
animation.autoreverses=YES;
/*動畫結(jié)束移除之前動畫對視圖的影響,回到初始狀態(tài)*/
animation.removedOnCompletion=NO;
animation.fillMode=kCAFillModeForwards;
/*應(yīng)用動畫*/
[view.layeraddAnimation:animationforKey:@"animationScaleKey"];
10.
NSOpertion如何實現(xiàn)線程依賴?正確答案:對于a、b、c3個線程,如何使用NSOpertion和NSOpertionQueue實現(xiàn)執(zhí)行完a和b后再執(zhí)行c的結(jié)果?
對于上述問題,其實可以通過NSOpertion的依賴特性實現(xiàn),即讓c依賴于a和b,這樣只有a和b都執(zhí)行完后,c才可以開始執(zhí)行。
/*獲取主隊列(主線程)*/
NSOperationQueue*queue=[NSOperationQueuemainQueue];
/*創(chuàng)建a、b、c操作*/
NSOperation*a=[NSBlockOperationblockOperationWithBlock:^{
NSLog(@"OperationAStart!");
[NSThreadsleepForTimeInterval:3.0];
NSLog(@"OperationADone!");
}];
NSOperation*b=[NSBlockOperationblockOperationWithBlock:^{
NSLog(@"OperationBStart!");
[NSThreadsleepForTimeInterval:3.0];
NSLog(@"OperationBDone!");
}];
NSOperation*C=[NSBlockOperationbloekOperationWithBlock:^{
NSLog(@"OperationCStart!");
//......
}];
/*添加操作依賴,c依賴于a和b*/
[caddDependency:a];
[caddDependency:b];
/*添加操作a、b、c到操作隊列queue(特意將c在a和b之前添加)*/
[queueaddOperation:c];
[queueaddOperation:a];
[queueaddOperation:b];
程序的輸出結(jié)果為:
2017-03-1813:51:37.770SingleView[15073:531745]OperationAStart!
2017-03-1813:51:40.772SingleView[15073:531745]OperationADone!
2017-03-1813:51:40.775SingleView[15073:531745]OperationBStart!
2017-03-1813:51:43.799SingleView[15073:531745]OperationBDone!
2017-03-1813:51:43.800SingleView[15073:5317451OperationCStart!
11.
什么是存儲過程?它與函數(shù)有什么區(qū)別與聯(lián)系?正確答案:SQL語句執(zhí)行的時候要先編譯,然后被執(zhí)行。在大型數(shù)據(jù)庫系統(tǒng)中,為了提高效率,將為了完成特定功能的SQL語句集進行編譯優(yōu)化后,存儲在數(shù)據(jù)庫服務(wù)器中,用戶通過指定存儲過程的名字來調(diào)用執(zhí)行。
例如,如下為一個創(chuàng)建存儲過程的常用語法。
createproceduresp_name@[參數(shù)名][類型]
as
begin
......
End
調(diào)用存儲過程語法:execsp_name[參數(shù)名]
刪除存儲過程語法:dropproceduresp_name
使用存儲過程可以增強SQL語言的功能和靈活性,由于可以用流程控制語句編寫存儲過程,有很強的靈活性,所以可以完成復(fù)雜的判斷和運算,并且可以保證數(shù)據(jù)的安全性和完整性,同時存儲過程可以使沒有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫,也保證了數(shù)據(jù)的安全。
需要注意的是,存儲過程不等于函數(shù),二者雖然本質(zhì)上沒有區(qū)別,但具體而言,還是有如下幾個方面的區(qū)別:
1)存儲過程一般是作為一個獨立的部分來執(zhí)行的,而函數(shù)可以作為查詢語句的一個部分來調(diào)用。由于函數(shù)可以返回一個對象,所以它可以在查詢語句中位于FROM關(guān)鍵字的后面。
2)一般而言,存儲過程實現(xiàn)的功能較復(fù)雜,而函數(shù)實現(xiàn)的功能針對性比較強。
3)函數(shù)需要用括號包住輸入的參數(shù),且只能返回一個值或表對象,存儲過程可以返回多個參數(shù)。
4)函數(shù)可以嵌入在SQL中使用,可以在SELECT中調(diào)用,存儲過程不行。
5)函數(shù)不能直接操作實體表,只能操作內(nèi)建表。
6)存儲過程在創(chuàng)建時即在服務(wù)器上進行了編譯,執(zhí)行速度更快。
12.
當(dāng)使用block時,什么情況會發(fā)生引用循環(huán)?如何解決?正確答案:常見的使用block引起引用循環(huán)的情況為:在一個對象中強引用了一個block,在該block中又強引用了該對象,此時就出現(xiàn)了該對象和該block的循環(huán)引用。示例代碼如下:
/*Test.h*/
#import<Foundation/Foundation.h>
/*聲明一個名為MYBlock的block,參數(shù)為空,返回值為void*/
typedefvoid(^MYBlock)();
@interfaceTest:NSObject
/*定義并強引用一個MYBlock*/
@property(nonatomic,strong)MYBlockblock;
/*對象屬性*/
@property(nonatomic,copy)NSString*name;
-(void)print;
@end
/*Test.m*/
#import"Test.h"
@implementationTest
-(void)ptint{
self.block=^{
NSLog(@"%@",);
};
self.block();
}
@end
解決上面的引用循環(huán)的方法有以下兩種:一是強制將一方置nil,破壞引用循環(huán);二是將對象使用__weak或者__block修飾符修飾之后再在block中使用(注意是在自動引用計數(shù)下),代碼如下:
-(void)print{
__weaktypeof(self)weakSelf=self;
self.block=^{
NSLog(@"%@",weakS);
};
self.block();
}
13.
如何只通過屬性特質(zhì)的參數(shù)來實現(xiàn)公有的getter方法和私有的setter方法?正確答案:首先在不考慮自動合成的情況下,如果實現(xiàn)公有的getter方法,那么要在.h頭文件中聲明這個getter方法以暴露給外部調(diào)用,并在.m文件中進行實現(xiàn);然后手動在.m文件中寫一個私有的setter方法的實現(xiàn)即可,當(dāng)然私有方法可以在.m的continue區(qū)域進行私有方法聲明,但是沒有必要,只要不在.h文件中聲明暴露即可(C++中是要在.m文件最前面聲明的,否則要考慮方法調(diào)用順序,在方法實現(xiàn)之前無法被調(diào)用)。這里以一個簡單的Person類為例說明具體寫法,手動實現(xiàn)的方法代碼如下:
/*Person.h頭文件*/
@interfacePerson:NSObject{
@private
NSString*name;
}
/*聲明公有的getter方法*/
-(NSString*)name;
@end
/*Person.m實現(xiàn)文件*/
#import"Person.h"
/*contime私有聲明區(qū)域*/
@interfacePerson()
/*在.m文件的continue區(qū)域聲明私有setter方法,通常私有方法不需要聲明,可以省略*/
-(void)setName:(NSString*)newName;
@end
/*implementation實現(xiàn)區(qū)域*/
@implementationPerson
/*公有的getter方法實現(xiàn)*/
-(NSString*)name{
/*注意這里直接返回實例變量,如果使用,那么相當(dāng)于getter方法調(diào)用自身,此時會造成死循環(huán)*/
returnname;
}
/*私有的setter方法實現(xiàn)*/
-(void)setName:(NSString*)newName{
/*注意這里直接給實例變量賦值,如果使用,那么相當(dāng)于setter方法調(diào)用自身,此時會造成死循環(huán)*/
name=newName:
}
@end
這樣在類外部是可以調(diào)用getter方法的,但setter方法只能在本類內(nèi)部被調(diào)用,外部無法找到setter方法。
現(xiàn)在題目要求使用屬性的讀寫語義也就是readwrite和readonly來讓編譯器自動合成上面的效果,如何實現(xiàn)呢?
實現(xiàn)方法是要在.h頭文件和.m實現(xiàn)文件中定義屬性變量兩次,第一次在.h頭文件中使用readonly讀寫語義讓編譯器自動合成公有的getter方法,第二次在.m文件中使用readwrite讀寫語義再讓編譯器自動合成私有的setter方法。代碼如下:
/*Person.h頭文件*/
@interfacePerson:NSObject
/*使用readonly,讓編譯器只合成公有g(shù)etter方法*/
@property(nonatomic,readonly,copy)NSString*name;
@end
/*Person.m實現(xiàn)文件*/
/*continue私有聲明區(qū)域*/
@interfacePerson()
/*讓編譯器再合成私有setter方法,其中readwrite可以省略,因為默認就是readwrite*/
@property(nonatomic,readwrite,copy)NSString*name;
@end
/*implementation實現(xiàn)區(qū)域*/
@implementationPerson
/*測試*/
-(void)test{
/*下面兩條語句等效,都是調(diào)用setter方法,但注意setter方法是私有的,只能在此處調(diào)用,在外部無法調(diào)用*/
=@"nmne";
[selfsetName:@"name"];
}
@end
14.
CocoaTouch的底層技術(shù)架構(gòu)是什么?正確答案:如圖所示,CocoaTouch的底層技術(shù)架構(gòu)主要分4層,每層負責(zé)的服務(wù)見下表。
CocoaTouch架構(gòu)圖CocoaTouch的4層架構(gòu)及其服務(wù)架構(gòu)層服務(wù)CocoaTouch框架層UI組件、觸摸處理和事件驅(qū)動、系統(tǒng)接口Media媒體層音頻視頻播放、動畫、2D和3D圖形CoreService核心服務(wù)層、底層特性、文件、網(wǎng)絡(luò)、位置服務(wù)等CoreOS系統(tǒng)層內(nèi)存管理、底層網(wǎng)絡(luò)、硬件管理
15.
程序、進程與線程的區(qū)別是什么?正確答案:程序、進程與線程的區(qū)別見表。程序、進程與線程區(qū)別名稱描述程序一組指令的有序結(jié)合,是靜態(tài)的指令,是永久存在的進程具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的一個獨立單元。進程的存在是暫時的,是一個動態(tài)概念線程線程的一個實體是CPU調(diào)度和分配的基本單元,是比進程更小的能獨立運行的基本單元。本身基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器、一組寄存器和棧)。一個線程可以創(chuàng)建和撤銷另一個線程,同一個進程中的多個線程之間可以并發(fā)執(zhí)行
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。
16.
如何對UITableView的滾動加載進行優(yōu)化,防止卡頓?正確答案:表格視圖(UITableView)主要用來羅列展示數(shù)據(jù)項(見圖),如果數(shù)據(jù)量很大,那么表格中將需要同樣多的cell視圖來顯示,而cell的大量創(chuàng)建和初始化會造成內(nèi)存壓力,影響界面的流暢性,因此對表格視圖的加載優(yōu)化十分重要。UITableView的滾動優(yōu)化主要在于以下兩個方面:
典型表格視圖
1)減少cellForRowAtIndexPath代理中的計算量(cell的內(nèi)容計算)。
2)減少heightForRowAtIndexPath代理中的計算量(cell的高度計算)。
減少cellForRowAtIndexPath代理中的計算量:
①先要提前計算每個cell中需要的一些基本數(shù)據(jù),代理調(diào)用的時候直接取出。
②圖片要異步加載,加載完成后再根據(jù)cell內(nèi)部UIImageView的引用設(shè)置圖片。
③圖片數(shù)量多時,圖片的尺寸要根據(jù)需要提前經(jīng)過transform矩陣變換壓縮好(直接設(shè)置圖片的contentMode讓其自行壓縮仍然會影響滾動效率),必要的時候要準備好預(yù)覽圖和高清圖,需要時再加載高清圖。
④圖片的“懶加載”方法,即延遲加載,當(dāng)滾動速度很快時避免頻繁請求服務(wù)器數(shù)據(jù)。
⑤盡量手動Drawing視圖提升流暢性,而不是直接子類化UITableViewCell,然后覆蓋drawRect方法,因為cell中不是只有一個contentview。繪制cell不建議使用UIView,建議使用CALayer,因為要參考UIView和CALayer的區(qū)別和聯(lián)系。
減少heightForRowAtIndexPath代理中的計算量:
①由于每次tableView進行update(更新)都會對每一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年暑期學(xué)校校園內(nèi)環(huán)境衛(wèi)生管理與守校合同聯(lián)勝2篇
- 《BEF系列簡介》課件
- 2024年標準車輛長期租賃合同樣本版B版
- 四川省南充市2024-2025學(xué)年高三上學(xué)期一診考試地理試題 含解析
- 《保險的意義與功能》課件
- 2025股份受讓協(xié)商合同書
- 2024年度樹林景觀林買賣及維護服務(wù)合同3篇
- 2024年度創(chuàng)業(yè)投資融資擔(dān)保服務(wù)合同模板下載3篇
- 2025小區(qū)改造合同
- 2024年涉及人工智能語音識別技術(shù)許可合同
- QC080000培訓(xùn)講義課件
- 《玉米合理密植技術(shù)》課件
- 科技興國未來有我主題班會教學(xué)設(shè)計
- 《不穩(wěn)定型心絞痛》課件
- 江蘇省揚州市邗江中學(xué)2025屆物理高一第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測試題含解析
- 自媒體宣傳采購項目競爭性磋商招投標書范本
- 新保密法知識測試題及答案
- 2023年民航東北空管局人員招聘考試真題
- 2025(新統(tǒng)編版)八年級歷史上冊 第5單元 大單元教學(xué)設(shè)計
- 戶外施工移動發(fā)電機臨時用電方案
- 《雁門太守行》說課稿
評論
0/150
提交評論