iOS程序員面試分類模擬25_第1頁
iOS程序員面試分類模擬25_第2頁
iOS程序員面試分類模擬25_第3頁
iOS程序員面試分類模擬25_第4頁
iOS程序員面試分類模擬25_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論