iOS程序員面試分類模擬7_第1頁(yè)
iOS程序員面試分類模擬7_第2頁(yè)
iOS程序員面試分類模擬7_第3頁(yè)
iOS程序員面試分類模擬7_第4頁(yè)
iOS程序員面試分類模擬7_第5頁(yè)
已閱讀5頁(yè),還剩13頁(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程序員面試分類模擬7簡(jiǎn)答題1.

在UITableViewController中創(chuàng)建UITableViewCell時(shí),initWithSytle:resuseIdentifier中的reuseIden(江南博哥)tifier有什么用?UITableViewCell的復(fù)用原理是怎么樣的?正確答案:reuseIdentifier順名思義是一個(gè)復(fù)用標(biāo)識(shí)符,是一個(gè)自定義的獨(dú)一無(wú)二的字符串,用來(lái)唯一地標(biāo)記某種重復(fù)樣式的UITableViewCell。系統(tǒng)是通過(guò)reuseIdentifier來(lái)復(fù)用已經(jīng)創(chuàng)建了的指定樣式的cell,iOS中表格的cell通過(guò)復(fù)用機(jī)制來(lái)提高加載效率,因?yàn)槎鄶?shù)情況下表格中的cell樣式都是重復(fù)的,只是數(shù)據(jù)模型不同而已。因此,系統(tǒng)可以在保證創(chuàng)建一定數(shù)量的cell的前提下(覆蓋整個(gè)tableView),通過(guò)保存并重復(fù)使用已經(jīng)創(chuàng)建的cell來(lái)提高加載效率和優(yōu)化內(nèi)存,避免不停地創(chuàng)建和銷毀cell元素。

UITableViewCell的復(fù)用原理其實(shí)很簡(jiǎn)單,可以通過(guò)下麗一個(gè)簡(jiǎn)單的例子來(lái)理解。

開(kāi)發(fā)時(shí)在UITableViewController類中寫cell復(fù)用代碼的基小模板如下:

/*可復(fù)用cell制作*/

-(UITableViewCell*)tableView:(UITableView*)tableView

cellForRowAtIndexPath:(NSIndexPath*)indexPath{

/*定義cell重用的靜態(tài)標(biāo)志符*/

staticNSString*cell_id=@"cell_id_demo";

/*優(yōu)先使用可復(fù)用的cell*/

UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:cell_id];

/*如果要復(fù)用的cell還沒(méi)有創(chuàng)建,那么創(chuàng)建一個(gè)供之后復(fù)用*/

if(cell=nil){

/*新創(chuàng)建cell并使用cell_id復(fù)用符標(biāo)記*/

cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cell_id];

}

/*配置cell數(shù)據(jù)*/

cell.textLabe1.text=[NSStringstringWithFormat:@"Cell%i",countNumber];

/*其他cell設(shè)置...*/

returncell;

}

代碼這樣寫的原因是通過(guò)調(diào)用當(dāng)前tableView的dequeueReusableCellWithIdentifier方法判斷指定的reuseIdentifier是否有可以重復(fù)使用的cell。如果有,那么會(huì)返回可復(fù)用的cell,cell就緒之后便可以開(kāi)始更新cell的數(shù)據(jù);如果沒(méi)有可以復(fù)用的cell,那么返回nil,然后會(huì)進(jìn)入后面的if語(yǔ)句,此時(shí)創(chuàng)建新的cell并給它標(biāo)記一個(gè)標(biāo)識(shí)符reuseIdentifier。注意上面的if語(yǔ)句并不是每次都創(chuàng)建一次新的cell,然后全部重復(fù)利用新創(chuàng)建的那一個(gè)cell,這是對(duì)cell復(fù)用機(jī)制的誤解。事實(shí)是要?jiǎng)?chuàng)建足夠數(shù)量的可覆蓋整個(gè)tableView的cell之后才會(huì)開(kāi)始復(fù)用之前的cell(UITableView中有一個(gè)visiableCells數(shù)組保存當(dāng)前屏幕可見(jiàn)的cell,還有一個(gè)reusableTableCells數(shù)組用來(lái)保存那些可復(fù)用的cell)。下面通過(guò)測(cè)試來(lái)驗(yàn)證。

如何簡(jiǎn)潔清楚地展示UITableViewCelI的復(fù)用機(jī)制呢?下面的例子是創(chuàng)建最基本的文本cell,并創(chuàng)建一個(gè)cell創(chuàng)建計(jì)數(shù)器,每次新創(chuàng)建cell計(jì)數(shù)器加1然后顯示在cell上,如果是復(fù)用的cell,那么會(huì)顯示是復(fù)用的哪一個(gè)cell,測(cè)試代碼如下:

/*分區(qū)個(gè)數(shù)設(shè)置為1*/

-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{

return1;

}

/*創(chuàng)建20個(gè)cell,保證覆蓋并超出整個(gè)tableView*/

-(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section{

return20;

}

/*cell復(fù)用機(jī)制測(cè)試*/

-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{

/*定義cell重用的靜態(tài)標(biāo)志符*/

staticNSString*cell_id=@"cell_id_demo";

/*計(jì)數(shù)用*/

staticintcountNumber=1;

/*優(yōu)先使用可復(fù)用的cell*/

UITableviewCell*cell=[tableViewdequeueReusableCellWithIdentifier:cell_id];

/*如果要復(fù)用的cell還沒(méi)有創(chuàng)建,那么創(chuàng)建一個(gè)供之后復(fù)用*/

if(cell=nil){

/*新創(chuàng)建cell并使用cell_id復(fù)用符標(biāo)記*/

cell=[[UITableViewCellalloc]initWithStyle:UITableviewCellStyleDefaultreuseIdentifier:cell_id];

/*計(jì)數(shù)器標(biāo)記新創(chuàng)建的cell*/

cell.textLabe1.text=[NSStringstringWithFormat:@"Cell%i"countNumber];

/*計(jì)數(shù)器遞增*/

countNumber++;

}

returncell;

}

運(yùn)行在iPhone5S設(shè)備上(UITableViewController作為跟控制器,tableView覆蓋整個(gè)屏幕),20個(gè)cell顯示結(jié)果依次為(見(jiàn)圖1和圖2):

圖1

cell剛好填滿屏幕

圖2

滑動(dòng)復(fù)用的cell

Cell1、Cell2、Cell3、Cell4、Cell5、Cell6、Cell7、Cell8、Cell9、Cell10、Cell11、Cell12、Cell13、Cell14、Cell1、Cell2、Cell3、Cell4、Cell5、Cell6。

可以看出一共創(chuàng)建了14個(gè)cell,其中整個(gè)屏幕可顯示13個(gè)cell,系統(tǒng)多創(chuàng)建一個(gè)的原因是保證在表格滑動(dòng)顯示半個(gè)cell時(shí)仍然能覆蓋整個(gè)tableView。之后的6個(gè)cell就是復(fù)用了開(kāi)始創(chuàng)建的那6個(gè)cell了。這樣UITableViewCell復(fù)用的基本機(jī)制就很清楚了,還會(huì)有reloadData或者reloadRowsAtIndex等刷新表格數(shù)據(jù)的情況,可能會(huì)伴隨新的cell創(chuàng)建和可復(fù)用cell的更新,但也是建立在基本復(fù)用機(jī)制的基礎(chǔ)之上的。

2.

能否在一個(gè)視圖控制器中嵌入兩個(gè)tableView控制器?正確答案:可以,相當(dāng)于視圖和視圖控制器的嵌套,視圖可以添加子視圖,視圖控制器也可以添加子控制器。這種情況有時(shí)會(huì)被用到而且很重要,但是有一點(diǎn)容易被忽視,就是將子視圖添加到了父視圖卻忘記將對(duì)應(yīng)的控制器作為子控制器添加到父控制器,導(dǎo)致子視圖能顯示但是不能響應(yīng)(沒(méi)有對(duì)接好控制器)。例如在當(dāng)前視圖上放一個(gè)小尺寸的表格組件,也就是在UIViewController上添加一個(gè)UITableViewController子控制器及其子view。

/*假設(shè)有3個(gè)視圖控制器,一個(gè)作為父控制器,兩個(gè)作為子控制器*/

UIViewController*superVC=[[UIViewControlleralloc]init];

UITableViewController*subVC1=[[UITableViewControlleralloc]init];

UITableViewController*subVC2=[[UITableViewControlleralloc]init];

/*將子視圖控制器添加到父視圖控制器(要注意調(diào)整子視圖的尺寸和位置合理顯示,這里忽略)*/

[superVC.viewaddSubview:subVC1.view];

[superVCaddChildViewController:subVC1];

[superVC.viewaddSubview:subVC2.view];

[superVCaddChildViewController:subVC2];

/*子視圖控制器的移除有對(duì)應(yīng)的方法,但只能是子視圖控制器主動(dòng)從父視圖控制器中移除*/

[subVC1.viewremoveFromSuperview];

[SubVC1removeFromParentViewController];

[subVC2.viewremoveFromSuperview];

[subVC2removeFromParentViewController];

此外,要注意和presentViewController方法添加子視圖控制器的區(qū)別,上面手動(dòng)添加子視圖控制器是可以自由調(diào)整子視圖的frame的(包括子視圖位置和尺寸),而presentViewController是用于頁(yè)面切換,切換后的子頁(yè)面會(huì)覆蓋整個(gè)屏幕而不可以自由調(diào)整子頁(yè)面位置和尺寸,對(duì)應(yīng)的子視圖控制器移除方法為dismissViewControllerAnimated。

/*顯示子視圖控制器,completion后的代碼塊如果不為空,那么添加結(jié)束后會(huì)觸發(fā)*/

[[parentVCpresentViewController:childVCanimated:NOcompletion:nil];

/*移除子視圖控制器,completion后的代碼塊如果不為空,那么添加結(jié)束后會(huì)觸發(fā)*/

[childVCdismissViewControllerAnimated:NOcompletion:nil];

3.

一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的datasource數(shù)據(jù)源?正確答案:多個(gè)數(shù)據(jù)源是完全可以的,問(wèn)題的重點(diǎn)是如何關(guān)聯(lián),因?yàn)閷?shù)據(jù)源(Model)和tableView視圖的對(duì)接工作是程序員完成的,所以數(shù)據(jù)源的多少?zèng)]有根本影響。處理上可以分開(kāi)依次對(duì)接,也可以通過(guò)數(shù)據(jù)的集合操作先將數(shù)據(jù)整理合并成一個(gè)數(shù)據(jù)源,然后對(duì)接。

例如,一個(gè)表格中的每個(gè)cell顯示的是一個(gè)人的基本信息,為了簡(jiǎn)單這里假設(shè)只有一個(gè)頭像和I一個(gè)姓名。假設(shè)有兩個(gè)數(shù)據(jù)源,一個(gè)數(shù)據(jù)源是頭像的url數(shù)組;另一個(gè)是姓名的字符串?dāng)?shù)組,對(duì)接時(shí)完全可以分開(kāi)在cell數(shù)據(jù)回調(diào)中對(duì)接,也可以將兩個(gè)數(shù)組合并然后對(duì)接。

合并數(shù)據(jù)用到的數(shù)據(jù)模型:

@interfaceModel:NSObject

@property(nonatomic,copy)NSString*name;

//姓名

@property(nonatomic,copy)NSString*url;

//圖片

@end

數(shù)據(jù)源緩沖器:

/*數(shù)據(jù)源*/

@property(nonatomic,strong)NSArray*nmne_datasource;

@property(nonatomic,strong)NSArray*url_datasource;

@property(nonatomic,strong)NSMutableArray*datasource;

處理多數(shù)據(jù)源:

/*請(qǐng)求數(shù)據(jù)*/

-(void)request{

/*姓名數(shù)據(jù)源*/

_name_datasource=@[@"張三",@"李四",@"小明",@"小李"];

_url_datasource=@[@"male",@"male",@"male",@"male"];

/*合并數(shù)據(jù)源*/

for(inti;i<_name_datasource.count;i++){

Model*model=[[Modelalloc]init];

=_name_datasource[i];

model.url=_url_datasource[i];

[_datasourceaddObject:model];

}

}

數(shù)據(jù)對(duì)接:

/*cell數(shù)據(jù)回調(diào)*/

-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{

staticNSString*identifier=@"identifier";

/*自制cell組件*/

AccountCell*cell=[[AccountCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:identifier];

/**多數(shù)據(jù)源分開(kāi)對(duì)接:**/

/*頭像*/

[cell.avatarsetImage:[UIImageimageNamed:_url_datasource[indexPath.row]];

/*姓名*/

.text=_name_datasource[indexPath.row];

/*或者:*/

/**數(shù)據(jù)源合并后對(duì)接**/

/*取出對(duì)應(yīng)數(shù)據(jù)模型*/

Model*model=_datasource[indexPath.row];

/*頭像*/

[cell.avatarsetImage:[UIImageimageNamed:model.url]];

/*姓名*/

.text=;

returncell;

}

4.

如何對(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視圖提升流暢性,而不是直接子類化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è)cell調(diào)用heightForRowAtIndexPath代理取得最新的height,會(huì)大大增加計(jì)算時(shí)間。如果表格的所有cell高度都是固定的,那么去掉heightForRowAtIndexPath代理,直接設(shè)置tableView的rowHeight屬性為固定的高度。

②如果高度不固定,那么應(yīng)盡量將cell的高度數(shù)據(jù)計(jì)算好并儲(chǔ)存起來(lái),代理調(diào)用的時(shí)候直接取,即將height的計(jì)算時(shí)間復(fù)雜度降低到O(1)。例如,在異步請(qǐng)求服務(wù)器數(shù)據(jù)時(shí),提前將cell高度計(jì)算好并作為datasource的一個(gè)數(shù)據(jù)存到數(shù)據(jù)庫(kù)供隨時(shí)取用。

5.

viewDidLoad和viewDidAppear的區(qū)別是什么?正確答案:當(dāng)界面第一次從xib文件或者storyboard加載界面,或者手寫代碼創(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ù)的代碼寫在何處取決于具體需求,如果所用的數(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)求代碼寫在viewDidAppear回調(diào)方法中。

6.

frame和bounds有什么區(qū)別?正確答案:frame是在父視圖坐標(biāo)系中view自身的位置和尺寸。(參照點(diǎn)是父親的坐標(biāo)系統(tǒng))

bounds是在自身坐標(biāo)系中view自身的位置和尺寸。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))

7.

masksToBounds屬性是什么?它有什么作用?正確答案:masksToBounds指在設(shè)置子layer在超出父layer時(shí)是否被裁剪,YES表示裁剪,NO表示不裁剪,默認(rèn)是NO;通常在通過(guò)設(shè)置layer.cornerRadius屬性實(shí)現(xiàn)圓角效果時(shí)要設(shè)置masksToBounds為YES,以保證圓角效果的實(shí)現(xiàn),但這種方法是一種很低效的實(shí)現(xiàn)方式,也是最簡(jiǎn)單直接的。

masksToBounds和clipsToBounds是不同的,前者指子layer層在超出父layer時(shí)是否被裁剪(masksToBounds是CALayer的屬性),而后者指子view在超出父view時(shí)是否被裁剪(clipsToBounds是UIView的屬性)。

8.

tintColor的作用是什么?正確答案:tintColor是iOS7以后在UIView類中新增的一個(gè)屬性。tintColot具有傳遞性,一般用來(lái)改變應(yīng)用的主色調(diào),默認(rèn)為nil,表示用父視圖默認(rèn)的顏色進(jìn)行著色。

9.

UIViewController的生命周期方法有哪些?正確答案:在開(kāi)發(fā)過(guò)程中,大量的邏輯代碼主要會(huì)寫在UIViewController的生命周期方法中,了解這些方法的含義和調(diào)用時(shí)機(jī)十分重要。UIViewController的主要生命周期方法及其含義見(jiàn)表。UIViewController的主要生命周期方法及其含義方法含義[UIViewControlleralloc]創(chuàng)建對(duì)象并分配內(nèi)存空間[UIViewControllerinitWithNibName:bundle:]視圖控制器nib初始化,初始化對(duì)象以及數(shù)據(jù)[ViewControllerinit]視圖控制器初始化,初始化對(duì)象以及數(shù)據(jù)-(void)loadView首次創(chuàng)建view調(diào)用該方法(例如首次調(diào)用view的getter方法:self.view,controller.view),如果使用了xib創(chuàng)建視圖,那么從nib加載視圖-(void)loadViewIfNeeded如果視圖控制器的視圖還沒(méi)有加載,那么加載-(void)viewDidLoad視圖加載完成,可以動(dòng)態(tài)添加其他UI控件-(void)viewWillAppear:(BOOL)animated視圖即將出現(xiàn)到屏幕上之前(每一次要顯示該視圖都會(huì)重復(fù)調(diào)用,不僅僅是第一次創(chuàng)建初始化之后,下面另外3個(gè)時(shí)機(jī)亦然)-(void)viewDidAppear:(BOOL)animated視圖已經(jīng)顯示到屏幕上之后-(void)viewWillDisappear:(BOOL)animated視圖即將從屏幕上消失(消失包括被銷毀、被隱藏、被覆蓋等情況)-(void)viewDidDisappear:(BOOL)animated視圖已經(jīng)從屏幕上消失-(void)viewWillLayoutSubviews在視圖的layoutSubviews方法激活(View自身的frame發(fā)生改變)前調(diào)用-(void)viewDidLayoutSubviews在視圖的layoutSubviews方法激活后立刻調(diào)用-(void)didReceiveMemoryWarning應(yīng)用收到內(nèi)存警告導(dǎo)致視圖無(wú)法加載時(shí)調(diào)用,需要手動(dòng)清理因?yàn)閕OS6以后不會(huì)默認(rèn)自動(dòng)清理,通常在應(yīng)用占用太大內(nèi)存時(shí)被系統(tǒng)進(jìn)行內(nèi)存警告,需要在下面的viewWillUnload方法中將UI手動(dòng)置nil-(void)viewWillUnload視圖將不會(huì)繼續(xù)加載,對(duì)應(yīng)于下面的viewDidUnload,iOS6后不會(huì)再對(duì)其進(jìn)行調(diào)用-(void)viewDidUnload在視圖控制器被釋放或者被設(shè)置為nil時(shí)調(diào)用,例如收到內(nèi)存警告無(wú)法加載時(shí),即非正常加載,而不是dealloc時(shí)的正常銷毀,這里要手動(dòng)清理界面元素資源;iOS6以后該回調(diào)方法被棄用了,任何情況下都不會(huì)再被調(diào)用,因?yàn)閮?nèi)存低時(shí)系統(tǒng)不再在這里清理視圖元素了,官方建議之前該回調(diào)內(nèi)進(jìn)行的清理工作應(yīng)轉(zhuǎn)移到didReceiveMemoryWarning回調(diào)方法中,但實(shí)際上也并不需要再進(jìn)行之前在viewDidUnload中進(jìn)行的視圖清理工作,系統(tǒng)會(huì)獨(dú)立于視圖單獨(dú)進(jìn)行處理-[UIViewControllerdealloc]視圖銷毀,可以釋放初始化時(shí)的對(duì)象等資源

10.

View和View之間的傳值方式有哪些?正確答案:以將控制器VCSource中的值傳到VCTarget中為例,可以有以下6種傳值方法。

1)通過(guò)視圖類對(duì)象的public屬性變量直接傳值:可以在VCSource的頭文件中定義public屬性變量,這樣在VCTarget中只要有VCSource的引用,即可直接訪問(wèn)其中的public屬性變量值。

2)公有方法或代理方法的參數(shù)傳值:在VCSource中調(diào)用VCTarget的公有方法并傳入?yún)?shù),即實(shí)現(xiàn)了在VCTarget中訪問(wèn)VCSource中的參數(shù)值;在VCTarget中實(shí)現(xiàn)VCSource的帶參數(shù)代理方法即可獲取VCSource中的值。

3)NSUserDefault簡(jiǎn)單數(shù)據(jù)存儲(chǔ)全局共享傳值:即在VCSource中存值,然后在VCTarget中將值取出進(jìn)行訪問(wèn)使用。

4)利用通知中心NSNotificationCenter:即讓VCSource向通知中心發(fā)出通知并傳入?yún)?shù)值,同時(shí)VCTarget監(jiān)聽(tīng)該通知從而訪問(wèn)VCSource傳來(lái)的參數(shù)值。

5)block塊傳值:利用block塊在視圖間傳值的主要應(yīng)用是定義接口和回調(diào)。例如,在VCSource中定義帶有block回調(diào)的對(duì)外接口方法,并將回調(diào)參數(shù)值傳入block中,這樣在VCTarget中調(diào)用VCSource中的該接口方法時(shí)即可在block回調(diào)中取得VCSource傳來(lái)的參數(shù)值。

/*VCSource中的Login接口方法及block回調(diào)*/

+(void)Login:(void(^)(NSInteger))callback{

callback(1);

//傳入圍調(diào)值

}

/*在VCTarget中調(diào)用Login接口方法并訪問(wèn)回調(diào)參數(shù)*/

[VCSourceLogin:^(NSIntegerresult){

NSLog(@"%li",(long)result);

}];

6)extern全局變量傳值:即在VCSource中定義extem全局變量暴露給外部訪問(wèn)。

11.

xib和storyboard相比各自的優(yōu)缺點(diǎn)是什么?正確答案:xib優(yōu)點(diǎn):對(duì)UI界面的設(shè)計(jì)提供了可視化界面的功能,可以通過(guò)拖動(dòng)的方式來(lái)繪制簡(jiǎn)單的UI界面,大大減少了編寫UI控件的代碼。

xib缺點(diǎn):當(dāng)界面改動(dòng)較大時(shí),需要重新添加約束:當(dāng)界面復(fù)雜度較高時(shí),xib很難實(shí)現(xiàn)滿足需求的布局;不利于團(tuán)隊(duì)開(kāi)發(fā),容易造成文件沖突。

storyboard優(yōu)點(diǎn):能夠通過(guò)可視化界面將Controller的跳轉(zhuǎn)關(guān)系聯(lián)系起來(lái),還能夠在Controller中進(jìn)行可視化布局,大大減少了開(kāi)發(fā)的代碼量。

storyboard缺點(diǎn):當(dāng)頁(yè)面很多時(shí),會(huì)顯得布局混亂,無(wú)法準(zhǔn)確判斷各個(gè)視圖之間的關(guān)系;不利于團(tuán)隊(duì)開(kāi)發(fā),容易造成沖突。

12.

如何進(jìn)行iOS6和iOS7的適配?正確答案:iOS6和iOS7的適配指iOS系統(tǒng)版本的適配,主要是應(yīng)對(duì)iOS系統(tǒng)的新特性,保證同種設(shè)備不同版本的系統(tǒng)上能夠支持相同的功能。

iOS的適配主要考慮兩方面,一方面是功能上要適配兼容;另一方面是界面要適應(yīng)不同分辨率的屏幕。

1)要實(shí)現(xiàn)功能的適配通常需要判斷當(dāng)前iOS系統(tǒng)的版本,而實(shí)現(xiàn)界面的適配通常需要判斷當(dāng)前設(shè)備的型號(hào)(屏幕分辨率)。判斷iOS系統(tǒng)版本的方法為取UIDevice的systemVersion系統(tǒng)版本值來(lái)比對(duì)。

#defineiOS7[[UIDevicecurrentDevice].systemVersiondoubleValue]>=6.0

2)判斷機(jī)型簡(jiǎn)單的是利用屏幕分辨率(屏幕高度)的差異性,通過(guò)屏幕高度來(lái)區(qū)分iPhone7、iPhone6或者iPhone5等。

13.

imageNamed和imageWithContentsOfFile有什么區(qū)別?正確答案:UIImage的imageNamed和imageWithContentsOfFile兩種加載方法的使用如下:

/*1.根據(jù)圖片文件名加載,會(huì)緩存*/

UIImage*image=[UIImageimageNamed:@"icon"];

/*2.根據(jù)文件路徑加載,不緩存*/

NSString*filePath=[[NSBundlemainBundle]pathForResource:@"icon"ofType:@"png"];

UIImage*image=[UIImageimageWithContentsOfFile:filePath];

/*另外對(duì)應(yīng)還有一個(gè)等效的實(shí)例方法*/

UIImage*image=[[UIImagealloc]initWithContentsOfFile:filePath];

兩種方法的主要區(qū)別是使用imageNamed方法會(huì)自動(dòng)緩存新加載的圖片并會(huì)重復(fù)利用緩存的圖片,而imageWithContentsOffile方法直接根據(jù)路徑加載圖片沒(méi)有緩存和取緩存的過(guò)程。imageNamed先根據(jù)指定的圖片資源名稱在系統(tǒng)緩沖中搜索圖片資源,找到即返回資源,找不到然后才到硬盤等地方重新加載圖片資源并緩存。imageWithContentsOfFile和imageWithData類似,不會(huì)緩存圖片,將圖片轉(zhuǎn)化成數(shù)據(jù)對(duì)象進(jìn)行加載。

關(guān)于兩者的選擇主要考慮它們是否緩存的特點(diǎn),對(duì)于那些尺寸較小且反復(fù)使用的圖片資源一般會(huì)選擇imageNamed方法,利用緩存加快加載速度。同時(shí)緩存太多又會(huì)占用太多空間,因此對(duì)于那些尺寸很大且不常用甚至只用一次的圖片,應(yīng)該選擇使用imageWithContentsOfFile方法加載,不進(jìn)行緩存。另外,注意imageWithContentsOfFile方法不可以直接加載Assets.xcassets圖集里的圖片,而需要將圖片拖入工程目錄。

14.

UIDevice如何獲取設(shè)備信息?正確答案:iOS開(kāi)發(fā)中獲取設(shè)備的信息指像設(shè)備號(hào)、應(yīng)用名稱以及國(guó)家語(yǔ)言等非用戶隱私信息,這些信息多數(shù)都可以在Xcode工程中看到,同時(shí)開(kāi)發(fā)者可以利用框架提供的UIDevice、NSBundle、NSLocale3個(gè)類來(lái)獲取一些開(kāi)發(fā)中常用到的信息。

1.UIDevice

UIDevice可以提供給開(kāi)發(fā)者很多移動(dòng)設(shè)備的基本信息,如設(shè)備名稱、設(shè)備模式、系統(tǒng)名稱、系統(tǒng)版本、設(shè)備唯一標(biāo)識(shí)符以及設(shè)備方向和設(shè)備電量等。

其中的設(shè)備方向是一個(gè)枚舉變量UIDeviceOrientation(TV中禁止使用),源代碼中的定義如下:

typedefNS_ENUM(NSInteger,UIDeviceOrientation){

UIDeviceOrientationUnknown,

UIDeviceOrientationPortrait,

//設(shè)備垂直,home鍵在下

UIDeviceOrientationPortraitUpsideDown,

//設(shè)備翻轉(zhuǎn),home鍵在上

UIDeviceOrientationLandscapeLeft,

//設(shè)備水平,home件在左

UIDeviceOrientationLandsoareRight,

//設(shè)備水平,home件在右

UIDeviceOrientationFaceUp,

//設(shè)備平放,面朝上

UIDeviceOrientationFaceDown

//設(shè)備平放,面朝下

}_TVOS_PROHIBITED;

在SDK源代碼中定義如下:

@property(nonatomic,readonly,strong)NSString*name;//e.g."MyiPhone"

@property(nonatomic,readonly,strong)NSString*model;//e.g.@"iPhone",@"iPodtouch"

@property(nonatomic,readonly,strong)NSString*localizedModel;//本地化的設(shè)備模式

@property(nonatomic,readonly,strong)NSString*systemName;//e.g.@"iOS"

@property(nonatomic,readonly,strong)NSString*systemVersion;//e.g@"4.0"

@property(nonatomic,readonly)UIDeviceOrientationorientation__TVOS_PROHIBITED;//返回當(dāng)前的設(shè)備方向,如果還沒(méi)有產(chǎn)生設(shè)備方向通知(設(shè)備方向未發(fā)生改變),那么返回UIDeviceOrientationUnknown

@property(nullable,nonatomic,readonly,strong)NSUUID

*identifierForVendorNS_AVAILABLE_IOS(6_0);

//可用于唯一標(biāo)識(shí)設(shè)備的一個(gè)UUID

測(cè)試示例代碼如下:

/*1.UIDevice*/

UIDevice*deviee=[UIDevicecurrentDevice];

//獲取當(dāng)前的device

/**設(shè)備基本信息**/

NSString*name=[devicename];

//@"iPhone5S"

NSString*model=[devicemodel];//@"iPhone"

NSString*localizedModel=[devicelocalizedModel];//@"iPhone"

NSString*systemName=[devicesystemName];//@"iPhoneOS"

NSString*systemVersion=[devicesystemVersion];//@"9.3.2"

/**設(shè)備方向**/

UIDeviceOrientationorientation=[deviceorientation];

//UIDeviceOrientationUnknown

/*設(shè)備類型:iPad或iPhone(iPod)等*/

if([[UIDevicecurrentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPad|UIUserInterfaceIdiomPhone){}

/**設(shè)備電量**/

device.batteryMonitoringEnabled=YES;

floatbatteryLevel=[UIDevicecurrentDevice].batteryLevel;//0~1.0對(duì)應(yīng)電量0~100%,-1.0表示電量未知

device.batteryMonitoringEnabled=YES;

/**設(shè)備ID**/

NSUUID*identifierForVendor=[deviceidentifierForVendor];

2.NSBundle

開(kāi)發(fā)者經(jīng)常用到類NSBundle的mainbundle,一個(gè)包含了nib文件、編譯代碼等資源的目錄,這個(gè)目錄下有一個(gè)infoDictionary,通過(guò)這個(gè)信息字典開(kāi)發(fā)者可以獲取有關(guān)當(dāng)前應(yīng)用的一些基本信息,像應(yīng)用名稱、應(yīng)用版本等。

測(cè)試示例代碼如下:

/*2.NSBundle*/

/*獲取當(dāng)前設(shè)備的信息字典*/

NSDictionary*info_dic=[[NSBundlemainBundle]infoDictionary];

/*本地化的信息字典*/

NSDictionary*localized_info_dic=[[NSBundlemainBundle]localizedlnfoDictionary];

NSString*app_name=[info_dicobjectForKey:@"CFBundleDisplayName"];

//應(yīng)用名稱@"Demo"

NSString*app_version=[info_dicobjectForKey:@"CFBundleShortVersionString"];//應(yīng)用版本@"1.0"

NSString*app_build_version=[info_dicobjectForKey:@"CFBundleVersion"];//應(yīng)用build版本@"1"

3.NSLocale

顧名思義,NSLocale類是用于獲取一些本地化信息的,如國(guó)家、時(shí)間日期和語(yǔ)言等。這里主要展示常用到的獲取國(guó)家和語(yǔ)言代碼的方法。

測(cè)試示例代碼如下:

/*3.NSLocale*/

/*3.1獲取偏好語(yǔ)言*/

NSArray*languageArray=[NSLocalepreferredLanguages];

NSString*language=[languageArrayobjectAtIndex0];//@"en_HK"

/*3.2獲取本

溫馨提示

  • 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)論