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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

iOS程序員面試分類(lèi)模擬25簡(jiǎn)答題1.

isKindOfClass和isMemberOfClass有什么區(qū)別與聯(lián)系?正確答案:isKindOfClass和isMemberOfClass都是Obje(江南博哥)ctive-C語(yǔ)言的內(nèi)省特性方法,用于實(shí)現(xiàn)動(dòng)態(tài)類(lèi)型識(shí)別(判斷某個(gè)對(duì)象是否屬于某個(gè)動(dòng)態(tài)類(lèi)型)。但兩者的類(lèi)型判定深度不同。

isKindOfClass的判“真”要求相對(duì)寬松,它是判斷某個(gè)對(duì)象是否是Class類(lèi)型的實(shí)例或其子類(lèi)的實(shí)例。

isMemberOfClass的判“真”要求相對(duì)更高,比isKindOfClass嚴(yán)格的是,isMemberOfClass只判斷某個(gè)對(duì)象是否是Class類(lèi)型的實(shí)例,不放寬到其子類(lèi)。

例如:Dog類(lèi)繼承自Animal類(lèi),對(duì)于一個(gè)Dog類(lèi)型的實(shí)例對(duì)象dog,[dogisKindOfClass:[Animalclass]]為真,而[dogisMemberOfClass:[Animalclass]]為假。

/*Dog類(lèi)繼承自父類(lèi)Animal*/

Dog*dog=[[Dogalloc]init];

[dogisKindOfClass:[Dogclass]];

//true

[dogisKindOfClass:[Animalclass]];

//true

[dogisMemberOfClass:[Dogclass]];//true

[dogisMemberOfClass:[Animalclass]];//false

2.

contentsScale屬性有什么作用?正確答案:圖層的contentsScale屬性屬于支持高分辨率屏幕(如Retina屏幕)機(jī)制的一部分,它定義了圖層content中圖像的像素尺寸與視圖大小的比例。它也被用來(lái)判斷在繪制圖層時(shí)允許為content屬性創(chuàng)建的空間大小,以及需要顯示的圖片的拉伸度。

默認(rèn)情況下,contentsScale的值是1.0,也就是說(shuō)圖層的繪制系統(tǒng)將會(huì)以每個(gè)點(diǎn)對(duì)應(yīng)一個(gè)像素來(lái)繪制圖片。如果將其設(shè)置為2.0,那么會(huì)以每個(gè)點(diǎn)對(duì)應(yīng)兩個(gè)像素來(lái)繪制圖片,此即所謂的Retina屏幕。

在開(kāi)發(fā)中,有時(shí)會(huì)直接為圖層的content設(shè)置圖片,這時(shí)可以設(shè)置contentsScale為合適的值,以防止圖片在Retina屏幕上顯示不正確(像素化或模糊),代碼如下:

layer.contentsScale=[UIScreenmainScreen].scale;

3.

在Objective-C中,前置運(yùn)算和后置運(yùn)算有什么區(qū)別?正確答案:Objective-C支持大部分標(biāo)準(zhǔn)C語(yǔ)言的運(yùn)算符,其中包含的前置運(yùn)算符和后置運(yùn)算符有:++、+、--、-。以++操作為例,對(duì)于變量a,當(dāng)單獨(dú)使用++a和a++時(shí),它們是沒(méi)有任何區(qū)別的,都是變量a的自增運(yùn)算。當(dāng)涉及表達(dá)式運(yùn)算時(shí),這兩種情況的計(jì)算過(guò)程有明顯的差別,示例代碼如下。

方式一:

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

對(duì)于方式一和方式二兩段代碼,其結(jié)果是一樣的,其效果都是讓a的值+1,最后a的值都為11。而方式三和方式四兩段代碼的執(zhí)行結(jié)果是有明顯區(qū)別的。方式三代碼的作用是先對(duì)a執(zhí)行+1的操作,再將a的值賦值給b。因此,最后a和b的值都是11。方式四代碼的作用是先將a的值復(fù)制一份寄存,然后對(duì)a執(zhí)行+1的操作,于是a變成11,但是復(fù)制出來(lái)的值還是10,a++運(yùn)算完畢后,再將復(fù)制出來(lái)的值10賦值給b,所以最后變量b的值是10,而變量a的值是11。

總而言之,后置的++運(yùn)算符是先將變量的值返回,然后自增1;而前置的++運(yùn)算符,則是先將值自增1,再返回其值。

4.

Objective-C中的屬性和實(shí)例變量有哪些區(qū)別?正確答案:從下面的代碼中可以很明顯地看出它們的區(qū)別:

@interfaceTest:NSObject{

/*實(shí)例變量*/

@private

NSString*major;

@public

intage;

}

/*屬性變量*/

@property(nonatomic,copy)NSString*name;

@end

Objective-C中的屬性主要是對(duì)傳統(tǒng)實(shí)例變量的封裝,類(lèi)對(duì)象有一個(gè)屬性列表用來(lái)存放類(lèi)的所有屬性。屬性和實(shí)例變量的區(qū)別主要有以下幾個(gè)方面的內(nèi)容:

1)實(shí)例變量的存放采用硬編碼,編譯后寫(xiě)死,根據(jù)距起始地址的偏移量來(lái)訪問(wèn)變量,不可再插入新變量,而屬性可以在運(yùn)行時(shí)動(dòng)態(tài)添加刪除。

2)實(shí)例變量可以通過(guò)@prirate、@public和@protected等修飾詞來(lái)定義變量的作用域,限制變量的訪問(wèn)權(quán)限,而屬性不可以。從設(shè)計(jì)角度,屬性主要是用來(lái)和外部類(lèi)進(jìn)行訪問(wèn)交互的,實(shí)例變量主要用于類(lèi)內(nèi)部使用。

3)屬性可以通過(guò)三類(lèi)屬性特質(zhì)分別來(lái)幫助內(nèi)存管理、多線程管理和讀寫(xiě)控制,可以讓編譯器自動(dòng)合成存取方法,而不用重復(fù)為每一個(gè)實(shí)例變量手寫(xiě)存取方法造成代碼臃腫。

5.

viewDidLoad和viewDidAppear的區(qū)別是什么?正確答案:當(dāng)界面第一次從xib文件或者storyboard加載界面,或者手寫(xiě)代碼創(chuàng)建窗口從loadView加載界面時(shí),才會(huì)調(diào)用viewDidLoad回調(diào)方法,而viewDidAppear方法在每次界面出現(xiàn)時(shí)都會(huì)調(diào)用,包括第一次加載,或者跳轉(zhuǎn)離開(kāi)后又跳轉(zhuǎn)回來(lái)時(shí)。

從服務(wù)器加載數(shù)據(jù)的代碼寫(xiě)在何處取決于具體需求,如果所用的數(shù)據(jù)在第一次加載后便不會(huì)再改變,那么可以在viewDidLoad中進(jìn)行請(qǐng)求。如果界面加載后服務(wù)器數(shù)據(jù)可能會(huì)變,又必須保證當(dāng)前界面的數(shù)據(jù)是最新的,那么當(dāng)重新回到界面時(shí)就要重新加載最新數(shù)據(jù),應(yīng)該將數(shù)據(jù)請(qǐng)求代碼寫(xiě)在viewDidAppear回調(diào)方法中。

6.

在Objective-C中,與alloe語(yǔ)義相反的方法是dealloc還是release?正確答案:alloc與dealloc語(yǔ)意相反,alloc是創(chuàng)建變量,dealloc是釋放變量。

retain與release語(yǔ)義相反,retain保留一個(gè)對(duì)象,調(diào)用后使變量的引用計(jì)數(shù)加1,而release釋放一個(gè)對(duì)象,調(diào)用后使變量的引用計(jì)數(shù)減1。

雖然alloc對(duì)應(yīng)dealloc,retain對(duì)應(yīng)release,但是與alloc配對(duì)使用的方法是release,而不是dealloc。為什么呢?這要從它們的實(shí)際效果來(lái)看。事實(shí)上alloc和release配對(duì)使用只是表象,本質(zhì)上還是retain和release的配對(duì)使用。alloc用來(lái)創(chuàng)建對(duì)象,剛創(chuàng)建的對(duì)象默認(rèn)引用計(jì)數(shù)為1,相當(dāng)于調(diào)用alloc創(chuàng)建對(duì)象過(guò)程中同時(shí)會(huì)調(diào)用一次retain使對(duì)象引用計(jì)數(shù)加1,自然要有對(duì)應(yīng)的release的一次調(diào)用,使對(duì)象不再被用時(shí)能夠被釋放掉防止內(nèi)存泄漏。

此外,dealloc是在對(duì)象引用計(jì)數(shù)為0以后系統(tǒng)自動(dòng)調(diào)用的,dealloc沒(méi)有使對(duì)象引用計(jì)數(shù)減1的作用,只是在對(duì)象引用計(jì)數(shù)為0后被系統(tǒng)調(diào)用進(jìn)行內(nèi)存回收的收尾工作。

7.

什么是ReactiveCocoa?如何使用?正確答案:ReactiveCocoa是GitHub開(kāi)源的應(yīng)用于iOS和OSX的FRP框架,它吸取了.Net的ReactiveExtensions的設(shè)計(jì),并實(shí)現(xiàn)了Objective-C和Swift兩個(gè)版本。

ReactiveCocoa的宗旨是Streamsofvaluesovertime(隨著時(shí)間變化而不斷流動(dòng)的數(shù)據(jù)流)。它的主要目的是想解決Controller過(guò)于臃腫的問(wèn)題,狀態(tài)及狀態(tài)之間的轉(zhuǎn)化問(wèn)題,數(shù)據(jù)和事件的綁定問(wèn)題以及消息傳遞的問(wèn)題。RAC中把事件、變量等都看作信號(hào),而信號(hào)就對(duì)應(yīng)了FRP中的流,當(dāng)信號(hào)被訂閱(subscribing)時(shí),信號(hào)的執(zhí)行才會(huì)被觸發(fā)。

下圖是事件和變量隨時(shí)間的流動(dòng)圖。

事件和變量隨時(shí)間的流動(dòng)圖

下面簡(jiǎn)單地介紹RAC的使用。示例代碼如下:

/*1.1創(chuàng)建一個(gè)信號(hào),并訂閱它*/

RACSignal*signal=[RACSignalcreateSignal:^RACDisposable*_Nullable(id<RACSubscriber>_Nonnullsubscriber){

inta=0:

[subscribersendNext:@(a)];

[subscribersendCompleted];

returnnil;

}];

/*訂閱信號(hào)signal*/

[signalsubscribeNext:^(id_Nullablex){

NSLog(@"x:%@",x);

}];

/*1.2監(jiān)聽(tīng)一個(gè)UITextField屬性text的變化,并打印text的值*/

[self.textField.rac_textSignalsubscribeNext:^(NSString*text){

NSLog(@"text:%@",text);

}];

/*1.3使用filter過(guò)濾UITextField中text長(zhǎng)度小于6的字符串*/

[[self.textField.rac_textSignalfilter:^BOOL(NSString*_Nullablevalue){

returnvalue.length>6;

}]subscribeNext:^(NSString*text){

NSLog(@"textvalue:%@",text);

}];

/*1.4通過(guò)map重新映射的信號(hào)持有的變量,實(shí)現(xiàn)獲取UITextField中text的長(zhǎng)度*/

RACSignal*textLengthSignal=[self.textField.rac_textSignalmap:^id_Nullable(NSString*value){

return@(value.length);

}];

[textLengthSignalsubscribeNext:^(NSNumber*length){

NSLog(@"textlength:%d",[lengthintValue]);

}];

/*1.5使用signalForControlEvents代替addTarget實(shí)現(xiàn)事件綁定*/

[[self.buttonrac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(__kindofUIControl*_Nullablex){

//dosomething...

VSCog(@"buttonclick");

}];

/*1.6將某個(gè)對(duì)象的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的強(qiáng)大遠(yuǎn)遠(yuǎn)不止如此,可以用它來(lái)封裝網(wǎng)絡(luò)請(qǐng)求,從而幫助Controller減少網(wǎng)絡(luò)請(qǐng)求的邏輯。開(kāi)發(fā)人員還可以用RAC重新實(shí)現(xiàn)MVVM模式,通過(guò)RAC實(shí)現(xiàn)模型與數(shù)據(jù)的綁定。如果你是一個(gè)有追求的程序員,想更加深入學(xué)習(xí)RAC,那么請(qǐng)到它的官網(wǎng)或者相關(guān)博客中學(xué)習(xí)。

8.

所謂的Objective-C是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言是什么意思?正確答案:Objective-C是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言主要指Objective-C語(yǔ)言的動(dòng)態(tài)性,包括動(dòng)態(tài)性和多態(tài)性兩個(gè)方面。

動(dòng)態(tài)性即Objective-C的動(dòng)態(tài)類(lèi)型、動(dòng)態(tài)綁定和動(dòng)態(tài)加載特性,將對(duì)象類(lèi)型的確定、方法調(diào)用的確定、代碼和資源的裝載等推遲到運(yùn)行時(shí)進(jìn)行,更加靈活。

多態(tài)是面向?qū)ο笞兂烧Z(yǔ)言的特性,Objective-C作為一門(mén)面向?qū)ο蟮恼Z(yǔ)言,自然具備這種多態(tài)性。多態(tài)性指來(lái)自不同類(lèi)的對(duì)象可以接收同一消息的能力,或者說(shuō)不同對(duì)象以自己的方式響應(yīng)相同的消息的能力。

9.

什么是隱式動(dòng)畫(huà)和顯式動(dòng)畫(huà)?正確答案:隱式動(dòng)畫(huà)是UIKit動(dòng)畫(huà)的基礎(chǔ),是iOS中創(chuàng)建動(dòng)態(tài)UI界面的最直接的一種方式。開(kāi)發(fā)者通過(guò)直接設(shè)定UI元素的一些可見(jiàn)屬性的目標(biāo)值,如frame、bounds、center、transform、alpha、backgroundColor、contentStretch等,即可自動(dòng)生成屬性變化的過(guò)渡動(dòng)畫(huà)。例如,設(shè)置視圖的目標(biāo)位置為P1,即可自動(dòng)生成從視圖當(dāng)前位置移動(dòng)到P1的平滑動(dòng)畫(huà)。隱式動(dòng)畫(huà)是一種默認(rèn)動(dòng)畫(huà),動(dòng)畫(huà)是線性的,可以滿足基本的需求,但對(duì)于一些復(fù)雜的動(dòng)畫(huà),如讓視圖沿曲線移動(dòng),隱式動(dòng)畫(huà)就無(wú)能為力了,需要定義顯式動(dòng)畫(huà)來(lái)實(shí)現(xiàn)。

例如,假設(shè)視圖view位于屏幕外,通過(guò)執(zhí)行下面的隱式動(dòng)畫(huà),view可以平滑地移入當(dāng)前視圖中央,動(dòng)畫(huà)時(shí)間為0.5s,動(dòng)畫(huà)結(jié)束時(shí)則回調(diào)可以緊接著進(jìn)行其他的操作,如繼續(xù)進(jìn)行下一個(gè)動(dòng)畫(huà)等。

/*隱式動(dòng)畫(huà),視圖平滑移入當(dāng)前視圖中央*/

[UIViewanimateWithDuration:0.5animations:^{

view.center=self.view.center;

}completion:^(BOOLfinished){

//動(dòng)畫(huà)結(jié)束回調(diào)...

}];

顯式動(dòng)畫(huà)不像隱式動(dòng)畫(huà)那樣默認(rèn)從一個(gè)初始狀態(tài)線性變化到目標(biāo)狀態(tài),而是需要顯式地定義完整的動(dòng)畫(huà)流程,這樣略微復(fù)雜的同時(shí)會(huì)更加靈活,可以實(shí)現(xiàn)更加復(fù)雜的動(dòng)畫(huà)效果。例如,隱式動(dòng)畫(huà)只能實(shí)現(xiàn)直線平移效果,而顯式動(dòng)畫(huà)可以顯式地定義任意的曲線路徑,讓視圖沿著曲線移動(dòng)。簡(jiǎn)單來(lái)說(shuō),顯式動(dòng)畫(huà)就是要顯式地定義動(dòng)畫(huà)對(duì)象,設(shè)置動(dòng)畫(huà)對(duì)象的各個(gè)狀態(tài)和值,然后將動(dòng)畫(huà)對(duì)象應(yīng)用到視圖上,即可呈現(xiàn)動(dòng)畫(huà)的效果。

例如,下面定義一個(gè)在x和y軸方向上(二維平面)不斷縮放的動(dòng)畫(huà)對(duì)緣,動(dòng)畫(huà)使視圖層先放大1.2倍,動(dòng)畫(huà)結(jié)束后回到初始狀態(tài),如此循環(huán)。應(yīng)用的時(shí)候?qū)⒃搫?dòng)畫(huà)對(duì)象添加到對(duì)應(yīng)視圖的layer層上即可。

/*定義基本動(dòng)畫(huà)對(duì)象(縮放動(dòng)畫(huà))*/

CABasicAnimation*animation=[CABasicAnimationanimationWithKeyPath:@"transformPath"];

/*設(shè)置動(dòng)畫(huà)目標(biāo)狀態(tài),xy平面放大1.2倍*/

CATransform3DscaleTransform=CATransform3DMakeScale(1.2,1.2,1);

animation.toValue=[NSValuevalueWithCATransform3D:scaleTransform];

/*動(dòng)畫(huà)持續(xù)時(shí)間0.5s*/

animation.duration=0.5;

/*動(dòng)畫(huà)不斷循環(huán)重復(fù)*/

animation.repeatCount=HUGE_VALF;

/*自動(dòng)逆動(dòng)畫(huà)*/

animation.autoreverses=YES;

/*動(dòng)畫(huà)結(jié)束移除之前動(dòng)畫(huà)對(duì)視圖的影響,回到初始狀態(tài)*/

animation.removedOnCompletion=NO;

animation.fillMode=kCAFillModeForwards;

/*應(yīng)用動(dòng)畫(huà)*/

[view.layeraddAnimation:animationforKey:@"animationScaleKey"];

10.

NSOpertion如何實(shí)現(xiàn)線程依賴?正確答案:對(duì)于a、b、c3個(gè)線程,如何使用NSOpertion和NSOpertionQueue實(shí)現(xiàn)執(zhí)行完a和b后再執(zhí)行c的結(jié)果?

對(duì)于上述問(wèn)題,其實(shí)可以通過(guò)NSOpertion的依賴特性實(shí)現(xiàn),即讓c依賴于a和b,這樣只有a和b都執(zhí)行完后,c才可以開(kāi)始執(zhí)行。

/*獲取主隊(duì)列(主線程)*/

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到操作隊(duì)列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.

什么是存儲(chǔ)過(guò)程?它與函數(shù)有什么區(qū)別與聯(lián)系?正確答案:SQL語(yǔ)句執(zhí)行的時(shí)候要先編譯,然后被執(zhí)行。在大型數(shù)據(jù)庫(kù)系統(tǒng)中,為了提高效率,將為了完成特定功能的SQL語(yǔ)句集進(jìn)行編譯優(yōu)化后,存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,用戶通過(guò)指定存儲(chǔ)過(guò)程的名字來(lái)調(diào)用執(zhí)行。

例如,如下為一個(gè)創(chuàng)建存儲(chǔ)過(guò)程的常用語(yǔ)法。

createproceduresp_name@[參數(shù)名][類(lèi)型]

as

begin

......

End

調(diào)用存儲(chǔ)過(guò)程語(yǔ)法:execsp_name[參數(shù)名]

刪除存儲(chǔ)過(guò)程語(yǔ)法:dropproceduresp_name

使用存儲(chǔ)過(guò)程可以增強(qiáng)SQL語(yǔ)言的功能和靈活性,由于可以用流程控制語(yǔ)句編寫(xiě)存儲(chǔ)過(guò)程,有很強(qiáng)的靈活性,所以可以完成復(fù)雜的判斷和運(yùn)算,并且可以保證數(shù)據(jù)的安全性和完整性,同時(shí)存儲(chǔ)過(guò)程可以使沒(méi)有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫(kù),也保證了數(shù)據(jù)的安全。

需要注意的是,存儲(chǔ)過(guò)程不等于函數(shù),二者雖然本質(zhì)上沒(méi)有區(qū)別,但具體而言,還是有如下幾個(gè)方面的區(qū)別:

1)存儲(chǔ)過(guò)程一般是作為一個(gè)獨(dú)立的部分來(lái)執(zhí)行的,而函數(shù)可以作為查詢語(yǔ)句的一個(gè)部分來(lái)調(diào)用。由于函數(shù)可以返回一個(gè)對(duì)象,所以它可以在查詢語(yǔ)句中位于FROM關(guān)鍵字的后面。

2)一般而言,存儲(chǔ)過(guò)程實(shí)現(xiàn)的功能較復(fù)雜,而函數(shù)實(shí)現(xiàn)的功能針對(duì)性比較強(qiáng)。

3)函數(shù)需要用括號(hào)包住輸入的參數(shù),且只能返回一個(gè)值或表對(duì)象,存儲(chǔ)過(guò)程可以返回多個(gè)參數(shù)。

4)函數(shù)可以嵌入在SQL中使用,可以在SELECT中調(diào)用,存儲(chǔ)過(guò)程不行。

5)函數(shù)不能直接操作實(shí)體表,只能操作內(nèi)建表。

6)存儲(chǔ)過(guò)程在創(chuàng)建時(shí)即在服務(wù)器上進(jìn)行了編譯,執(zhí)行速度更快。

12.

當(dāng)使用block時(shí),什么情況會(huì)發(fā)生引用循環(huán)?如何解決?正確答案:常見(jiàn)的使用block引起引用循環(huán)的情況為:在一個(gè)對(duì)象中強(qiáng)引用了一個(gè)block,在該block中又強(qiáng)引用了該對(duì)象,此時(shí)就出現(xiàn)了該對(duì)象和該block的循環(huán)引用。示例代碼如下:

/*Test.h*/

#import<Foundation/Foundation.h>

/*聲明一個(gè)名為MYBlock的block,參數(shù)為空,返回值為void*/

typedefvoid(^MYBlock)();

@interfaceTest:NSObject

/*定義并強(qiáng)引用一個(gè)MYBlock*/

@property(nonatomic,strong)MYBlockblock;

/*對(duì)象屬性*/

@property(nonatomic,copy)NSString*name;

-(void)print;

@end

/*Test.m*/

#import"Test.h"

@implementationTest

-(void)ptint{

self.block=^{

NSLog(@"%@",);

};

self.block();

}

@end

解決上面的引用循環(huán)的方法有以下兩種:一是強(qiáng)制將一方置nil,破壞引用循環(huán);二是將對(duì)象使用__weak或者_(dá)_block修飾符修飾之后再在block中使用(注意是在自動(dòng)引用計(jì)數(shù)下),代碼如下:

-(void)print{

__weaktypeof(self)weakSelf=self;

self.block=^{

NSLog(@"%@",weakS);

};

self.block();

}

13.

如何只通過(guò)屬性特質(zhì)的參數(shù)來(lái)實(shí)現(xiàn)公有的getter方法和私有的setter方法?正確答案:首先在不考慮自動(dòng)合成的情況下,如果實(shí)現(xiàn)公有的getter方法,那么要在.h頭文件中聲明這個(gè)getter方法以暴露給外部調(diào)用,并在.m文件中進(jìn)行實(shí)現(xiàn);然后手動(dòng)在.m文件中寫(xiě)一個(gè)私有的setter方法的實(shí)現(xiàn)即可,當(dāng)然私有方法可以在.m的continue區(qū)域進(jìn)行私有方法聲明,但是沒(méi)有必要,只要不在.h文件中聲明暴露即可(C++中是要在.m文件最前面聲明的,否則要考慮方法調(diào)用順序,在方法實(shí)現(xiàn)之前無(wú)法被調(diào)用)。這里以一個(gè)簡(jiǎn)單的Person類(lèi)為例說(shuō)明具體寫(xiě)法,手動(dòng)實(shí)現(xiàn)的方法代碼如下:

/*Person.h頭文件*/

@interfacePerson:NSObject{

@private

NSString*name;

}

/*聲明公有的getter方法*/

-(NSString*)name;

@end

/*Person.m實(shí)現(xiàn)文件*/

#import"Person.h"

/*contime私有聲明區(qū)域*/

@interfacePerson()

/*在.m文件的continue區(qū)域聲明私有setter方法,通常私有方法不需要聲明,可以省略*/

-(void)setName:(NSString*)newName;

@end

/*implementation實(shí)現(xiàn)區(qū)域*/

@implementationPerson

/*公有的getter方法實(shí)現(xiàn)*/

-(NSString*)name{

/*注意這里直接返回實(shí)例變量,如果使用,那么相當(dāng)于getter方法調(diào)用自身,此時(shí)會(huì)造成死循環(huán)*/

returnname;

}

/*私有的setter方法實(shí)現(xiàn)*/

-(void)setName:(NSString*)newName{

/*注意這里直接給實(shí)例變量賦值,如果使用,那么相當(dāng)于setter方法調(diào)用自身,此時(shí)會(huì)造成死循環(huán)*/

name=newName:

}

@end

這樣在類(lèi)外部是可以調(diào)用getter方法的,但setter方法只能在本類(lèi)內(nèi)部被調(diào)用,外部無(wú)法找到setter方法。

現(xiàn)在題目要求使用屬性的讀寫(xiě)語(yǔ)義也就是readwrite和readonly來(lái)讓編譯器自動(dòng)合成上面的效果,如何實(shí)現(xiàn)呢?

實(shí)現(xiàn)方法是要在.h頭文件和.m實(shí)現(xiàn)文件中定義屬性變量?jī)纱?,第一次?h頭文件中使用readonly讀寫(xiě)語(yǔ)義讓編譯器自動(dòng)合成公有的getter方法,第二次在.m文件中使用readwrite讀寫(xiě)語(yǔ)義再讓編譯器自動(dòng)合成私有的setter方法。代碼如下:

/*Person.h頭文件*/

@interfacePerson:NSObject

/*使用readonly,讓編譯器只合成公有g(shù)etter方法*/

@property(nonatomic,readonly,copy)NSString*name;

@end

/*Person.m實(shí)現(xiàn)文件*/

/*continue私有聲明區(qū)域*/

@interfacePerson()

/*讓編譯器再合成私有setter方法,其中readwrite可以省略,因?yàn)槟J(rèn)就是readwrite*/

@property(nonatomic,readwrite,copy)NSString*name;

@end

/*implementation實(shí)現(xiàn)區(qū)域*/

@implementationPerson

/*測(cè)試*/

-(void)test{

/*下面兩條語(yǔ)句等效,都是調(diào)用setter方法,但注意setter方法是私有的,只能在此處調(diào)用,在外部無(wú)法調(diào)用*/

=@"nmne";

[selfsetName:@"name"];

}

@end

14.

CocoaTouch的底層技術(shù)架構(gòu)是什么?正確答案:如圖所示,CocoaTouch的底層技術(shù)架構(gòu)主要分4層,每層負(fù)責(zé)的服務(wù)見(jiàn)下表。

CocoaTouch架構(gòu)圖CocoaTouch的4層架構(gòu)及其服務(wù)架構(gòu)層服務(wù)CocoaTouch框架層UI組件、觸摸處理和事件驅(qū)動(dòng)、系統(tǒng)接口Media媒體層音頻視頻播放、動(dòng)畫(huà)、2D和3D圖形CoreService核心服務(wù)層、底層特性、文件、網(wǎng)絡(luò)、位置服務(wù)等CoreOS系統(tǒng)層內(nèi)存管理、底層網(wǎng)絡(luò)、硬件管理

15.

程序、進(jìn)程與線程的區(qū)別是什么?正確答案:程序、進(jìn)程與線程的區(qū)別見(jiàn)表。程序、進(jìn)程與線程區(qū)別名稱描述程序一組指令的有序結(jié)合,是靜態(tài)的指令,是永久存在的進(jìn)程具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單元。進(jìn)程的存在是暫時(shí)的,是一個(gè)動(dòng)態(tài)概念線程線程的一個(gè)實(shí)體是CPU調(diào)度和分配的基本單元,是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單元。本身基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器、一組寄存器和棧)。一個(gè)線程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線程,同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行

簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。

16.

如何對(duì)UITableView的滾動(dòng)加載進(jìn)行優(yōu)化,防止卡頓?正確答案:表格視圖(UITableView)主要用來(lái)羅列展示數(shù)據(jù)項(xiàng)(見(jiàn)圖),如果數(shù)據(jù)量很大,那么表格中將需要同樣多的cell視圖來(lái)顯示,而cell的大量創(chuàng)建和初始化會(huì)造成內(nèi)存壓力,影響界面的流暢性,因此對(duì)表格視圖的加載優(yōu)化十分重要。UITableView的滾動(dòng)優(yōu)化主要在于以下兩個(gè)方面:

典型表格視圖

1)減少cellForRowAtIndexPath代理中的計(jì)算量(cell的內(nèi)容計(jì)算)。

2)減少heightForRowAtIndexPath代理中的計(jì)算量(cell的高度計(jì)算)。

減少cellForRowAtIndexPath代理中的計(jì)算量:

①先要提前計(jì)算每個(gè)cell中需要的一些基本數(shù)據(jù),代理調(diào)用的時(shí)候直接取出。

②圖片要異步加載,加載完成后再根據(jù)cell內(nèi)部UIImageView的引用設(shè)置圖片。

③圖片數(shù)量多時(shí),圖片的尺寸要根據(jù)需要提前經(jīng)過(guò)transform矩陣變換壓縮好(直接設(shè)置圖片的contentMode讓其自行壓縮仍然會(huì)影響滾動(dòng)效率),必要的時(shí)候要準(zhǔn)備好預(yù)覽圖和高清圖,需要時(shí)再加載高清圖。

④圖片的“懶加載”方法,即延遲加載,當(dāng)滾動(dòng)速度很快時(shí)避免頻繁請(qǐng)求服務(wù)器數(shù)據(jù)。

⑤盡量手動(dòng)Drawing視圖提升流暢性,而不是直接子類(lèi)化UITableViewCell,然后覆蓋drawRect方法,因?yàn)閏ell中不是只有一個(gè)contentview。繪制cell不建議使用UIView,建議使用CALayer,因?yàn)橐獏⒖糢IView和CALayer的區(qū)別和聯(lián)系。

減少heightForRowAtIndexPath代理中的計(jì)算量:

①由于每次tableView進(jìn)行update(更新)都會(huì)對(duì)每一個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論