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

下載本文檔

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

文檔簡(jiǎn)介

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

objective-C的優(yōu)缺點(diǎn)有哪些?正確答案:Objective-C的優(yōu)缺點(diǎn)見表。Objective-C的優(yōu)缺點(diǎn)優(yōu)點(diǎn)缺點(diǎn)1)Objec(江南博哥)tive-C是C語(yǔ)言的超集,在C語(yǔ)言的基礎(chǔ)上衍生了很多新的語(yǔ)言特性,封裝得很完善而且方便使用,大大降低了編程復(fù)雜度,因此開發(fā)中使用起來會(huì)感覺方便高效1)不支持命名空間(都是通過加一些像NS或者UI這樣的命名前綴來達(dá)到用命名空間防止命名沖突的作用,但這樣會(huì)使變量的命名更長(zhǎng))2)Category(類別)的使用,可以快速擴(kuò)展類的方法,同時(shí)使擴(kuò)展的功能模塊之間互不影響2)不支持運(yùn)算符重載3)Posing(扮演)特性,[ParentClassposeAs:[ChildrenClassclass]];該語(yǔ)言特性使得父類無須定義和初始化子類對(duì)象,即可通過父類扮演子類進(jìn)行操作3)不支持多重繼承(C++語(yǔ)言通過virtual關(guān)鍵字防止二義性的出現(xiàn),實(shí)現(xiàn)多重繼承)4)動(dòng)態(tài)語(yǔ)言特性,動(dòng)態(tài)類型、動(dòng)態(tài)綁定和動(dòng)態(tài)加載等,將類型確定、方法調(diào)用和資源加載等任務(wù)推遲到運(yùn)行時(shí),大大提高了編程靈活度4)使用動(dòng)態(tài)運(yùn)行時(shí)類型,所有的方法都是通過消息傳遞機(jī)制方法調(diào)用,有其動(dòng)態(tài)的優(yōu)勢(shì),同時(shí)也使很多編譯時(shí)的優(yōu)化方法無法使用降低了性能,例如:內(nèi)聯(lián)方法等5)指針:Objective-C保留了C語(yǔ)言強(qiáng)大的指針特性

6)Objective-C與C/C++可在.mm文件中進(jìn)行混合編程,靈活度更高

2.

相對(duì)于objective-C而言,Swift有什么新特性?正確答案:Swift是一門新型語(yǔ)言,它借鑒了Haskell、Ruby、Python、C#等語(yǔ)言特性,看上去偏腳本化。Swift仍然支持已有的Cocoa和CocoaTouch框架。

Swift的主要新特性如下:

1)安全:有嚴(yán)格的類型檢查。

2)強(qiáng)大:有高度優(yōu)化的LLVM編譯器。

3)新型:Swift借鑒多種語(yǔ)言特性,表達(dá)更簡(jiǎn)單精確。

Swift與Objective-C和C/C++的基本對(duì)比見表。C/C++、objective-C和Swift三者基本對(duì)比

C/C++Objective-CSwift庫(kù)引入#include<stdio.h>#import<Foundation/Foundation.h>importFoundation頭文件#include“Person.h”#import“Person.h”無常量定義#defineSPEED1.0#defineSPEED1.0letSPEED=1.0成員變量聲明intage;intage;varage:Int類方法聲明staticvoidspeak();+(void)speak();classfuncspeak(){...}實(shí)例方法聲明intspeak();-(int)speak();funcspeak(){...}動(dòng)態(tài)內(nèi)存申請(qǐng)Person*person=malloc(sizeof(Person));Person*person=newPerson;Person*person=[Personalloc];Varperson=Person()類方法調(diào)用Person::speak();[Personspeak];Person.speak()實(shí)例方法調(diào)用Person->speak();[personspeak]Person.speak()字符串“String”@“String”“String”

1.從基本的ViewController代碼窺探Objective-C和Swift的區(qū)別

(1)Swift

/*ViewController.swift*|

importUIKit

classViewController:UIViewController{

@IBOutletweakvarlabel1:UILabel!

@IBActionfuncbutton1(sender:AnyObject){

label1.text="HelloiOS!!!"

}

overridefuncviewDidLoad(){

super.viewDidLoad()

//Doanyadditionalsetupafterloadingtheview,typicallyfromanib.

}

overridefuncdidReceiveMemoryWaming(){

super.didReceiveMemoryWarning()

//Disposeofanyresourcesthatcanberecreated.

}

(2)Objective-C

/*ViewController.h*/

#import<UIKit/UIKit.h>

@interfaceViewController:UIViewController

@property(weak,nonatomic)IBOutletUILabel*labell;

-(IBAction)buttonl:(id)sender;

@end

/*ViewController.m*/

#import"ViewController.h"

@interfaceViewController()

@end

@implementationViewController

@synthesizelabel1;

-(void)viewDidLoad{

[superviewDidLoad];

//Doanyadditionalsetupafterloadingtheview,typicallyfromanib.

}

-(void)didReceiveMemoryWaming{

[superdidReceiveMemoryWarning];

//Disposeofanyresourcesthatcanberecreated.

}

-(IBAction)button1:(id)sender{

label1.text=@"HelloiOS!!!";

}

@end

2.SwiR類的定義

整個(gè)類文件都定義在一個(gè)Swift文件內(nèi):

importFoundation

classBall{

/*變量*/

varcenterX:Float

varcenterY:Float

varradius:Float

/*初始化方法*/

init(centerX:Float,centerY:Float,radius:Float){

selfcenterX=centerX

self.centerY=centerY

self.radius=radius

}

/*實(shí)例方法*/

funcmove(moveX:Float,_moveY:Float){

self.centerX+=moveX

self.centerY+=moveY

}

/*類方法*/

classfuncaClassMethod(){

print("Iamaclassmethod")

}

}

...

/*創(chuàng)建對(duì)象*/

varball1=Ball(centerX:7.0,centerY:5.0,radius:6.0)

/*方法調(diào)用*/

ball1.move(moveX:1.0,1.0)

Ball.aClassMethod0

3.Objective-C和Swift語(yǔ)言中流程控制語(yǔ)句的比較

(1)Objective-C

/*條件判斷*/

if(a<b){

//Dosomethinghere

}else{

//Doanotherthinghere

}

/*for循環(huán)*/

for(inti=0;i<10;i++){

//Dosomethinghere

}

/*while循環(huán)*/

while(count<10){

//Dosomethinghere

}

/*do-while循環(huán)*/

do{

//Dosomcthinghere

}while(count<10);

(2)Swift

/*條件判斷*/

ifa<b{

//Dosomethinghere

}else{

//Doanotherthinghere

}

/*for循環(huán)*/

forinti=0;i<10;i++{

//Dosomethinghere

}

/*while循環(huán)*/

whilecount<10{

//Dosomethinghere

}

/*repeat-while循環(huán)*/

repeat{

//Dosomethinghere

}whilecount<10

4.Objective-C和Swift語(yǔ)言中String字符串的對(duì)比

(1)Objective-C

NSString*Str=@"string";

NSString*formatStr=[NSStringstringWithFormat:@"%@andfloat%f",Str,3.1415"];

(2)Swift

/*可變字符串*/

varStr="string"

varStr:String="string"

varStr=String("string")

/*不可變字符串*/

letStr="string"

letStr:String="string"

letStr=String("string")

5.Objective-C和Swift語(yǔ)言中Array和MultableArray的對(duì)比

(1)Objective-C

/*靜態(tài)數(shù)組*/

NSArray*array=[[NSArrayalloc]initWithObjects:ball1,ball2,nil];

array[0].radius=10;

/*可變數(shù)組*/

NSMutableArray*mArray=[[NSMutableArrayalloc]initWithCapacity:2];

[mArrayaddObject:ball1];

[mArrayaddObject:ball2];

Ball*newball=[mArrayobjectAtIndex:1];

[mArrayremoveObjectAtIndex:1];

(2)Swift

/*靜態(tài)數(shù)組*/

letmyArray:Array<Ball>=[ball1,ball2]

letmyArray:[Ball]=[ball1,ball2]

letmyArray=[ball1,ball2]

myArray[0].radius=10

/*可變數(shù)組*/

vatmyArray:[Ball]=[]

myArray.append(ball1)

myArray.append(ball2)

varnewBall=myArray[1]

myArray.remove(at:0)

6.Objective-C和Swift語(yǔ)言中UIImageView的使用對(duì)比

(1)Objective-C

UIImageView*myImage=[[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"tiger.png"]];

[self.viewaddSubview:myImage];

myImage.center=CGPointMake(150,200);

myImage.frame=CGRectMake(0,0,50,25);

(2)Swift

letmyImage=UIImageView(image:UIImage(named:"tiger.png"))

view.addSubview(myImage)

myImage2:frame=CGRect(x:0,y:0,width:50,height:25)

myImage2.center=CGPoint(x:150,y:200)

3.

Foundation對(duì)象與CoreFoundation對(duì)象有什么區(qū)別?正確答案:Foundation對(duì)象是Objective-C對(duì)象,使用Objective-C語(yǔ)言實(shí)現(xiàn);而CoreFoundation對(duì)象是C對(duì)象,使用C語(yǔ)言實(shí)現(xiàn)。兩者之間可以通過__bridge、__bridge_transfer、__bridge_retained等關(guān)鍵字轉(zhuǎn)換(橋接)。

Foundation對(duì)象和CoreFoundation對(duì)象更重要的區(qū)別是ARC下的內(nèi)存管理問題。在非ARC下兩者都需要開發(fā)者手動(dòng)管理內(nèi)存,沒有區(qū)別。但在ARC下,系統(tǒng)只會(huì)自動(dòng)管理Foundation對(duì)象的釋放,而不支持對(duì)CoreFoundation對(duì)象的管理。因此,在ARC下兩者進(jìn)行轉(zhuǎn)換后,必須要確定轉(zhuǎn)換后的對(duì)象是由開發(fā)者手動(dòng)管理,還是由ARC系統(tǒng)繼續(xù)管理,否則可能導(dǎo)致內(nèi)存泄漏問題。

下面以NSString對(duì)象(Foundation對(duì)象)和CFStringRef對(duì)象(CoreFoundation對(duì)象)為例,介紹兩者的轉(zhuǎn)換和內(nèi)存管理權(quán)移交問題。

1)在非ARC下,NSString對(duì)象和CFStringRef對(duì)象可以直接進(jìn)行強(qiáng)制轉(zhuǎn)換,都是手動(dòng)管理內(nèi)存,無須關(guān)心內(nèi)存管理權(quán)的移交問題。

2)在ARC下,NSString對(duì)象和CFStringRef對(duì)象在相互轉(zhuǎn)換時(shí),需要選擇使用__bridge、__bridge_transfer和__bridge_retained來確定對(duì)象的管理權(quán)轉(zhuǎn)移問題,三者的作用語(yǔ)義分別如下:

①__bridge關(guān)鍵詞最常用,它的含義是不改變對(duì)象的管理權(quán)所有者,本來由ARC管理的Foundation對(duì)象,轉(zhuǎn)換成CoreFoundation對(duì)象后依然由ARC管理;本來由開發(fā)者手動(dòng)管理的CoreFoundation對(duì)象轉(zhuǎn)換成Foundation對(duì)象后繼續(xù)由開發(fā)者手動(dòng)管理。示例代碼如下:

/*ARC管理的Foundation對(duì)象*/

NSString*s1=@"string";

/*轉(zhuǎn)換后依然由ARC管理釋放*/

CFStringRefcfstring=(__bridgeCFStringRef)s1;

/*開發(fā)者手動(dòng)管理的CoreFoundation對(duì)象*/

CFStringRefs2=CFStringCreateWithCString(NULL,"string",kCFStringEncodingASCII);

/*轉(zhuǎn)換后仍然需要開發(fā)者手動(dòng)管理釋放*/

NSString*fstring=(__bridgeNSString*)s2;

②__bfidge_transfer用在將CoreFoundation對(duì)象轉(zhuǎn)換成Foundation對(duì)象時(shí),用于進(jìn)行內(nèi)存管理權(quán)的移交,即本來需由開發(fā)者手動(dòng)管理釋放的CoreFoundation對(duì)象在轉(zhuǎn)換成Foundation對(duì)象后,交由ARC來管理對(duì)象的釋放,開發(fā)者不用再關(guān)心對(duì)象的釋放問題,因?yàn)椴粫?huì)發(fā)生內(nèi)存泄漏。示例代碼如下:

/*開發(fā)者手動(dòng)管理的CoreFoundation對(duì)象*/

CFStringRefs2=CFStringCreateWithCString(NULL,"string",kCFStringEncodingASCII);

/*轉(zhuǎn)換后改由ARC管理對(duì)象的釋放,不用擔(dān)心內(nèi)存泄漏*/

NSString*fstring=(__bridge__transferNSString*)s2;

//NSString*fstring=(NSString*)CFBridgingRelease(s2);

//另一種等效寫法

③__bridge_retained用在將Foundation對(duì)象轉(zhuǎn)換成CoreFoundation對(duì)象時(shí),進(jìn)行ARC內(nèi)存管理權(quán)的剝奪,即本來由ARC管理的Foundation對(duì)象在轉(zhuǎn)換成CoreFoundation對(duì)象后,ARC不再繼續(xù)管理該對(duì)象,需要開發(fā)者自己進(jìn)行手動(dòng)釋放該對(duì)象,否則會(huì)發(fā)生內(nèi)存泄漏。示例代碼如下:

/*ARC管理的Foundation對(duì)象*/

NSString*s1=@"string";

/*轉(zhuǎn)換后ARC不再繼續(xù)管理,需要手動(dòng)釋放*/

CFStringRefcfstring=(__bridge__retainedCFStringRef)s1;

//CFStringRefcfstring=(CFStringRef)CFBridgingRetain(s1);

//另一種等效寫法

4.

Objective-C中的類方法和實(shí)例方法有什么本質(zhì)區(qū)別和聯(lián)系?正確答案:在比較類方法和實(shí)例方法的區(qū)別之前,先要明確Objective-C中的類對(duì)象和實(shí)例對(duì)象的概念,開發(fā)中定義的類自身也是一個(gè)對(duì)象,稱為類對(duì)象,保存該類的成員變量、屬性列表和方法列表等。類對(duì)象經(jīng)alloc和init實(shí)例化后成為實(shí)例對(duì)象。實(shí)例對(duì)象、類對(duì)象和元類的底層結(jié)構(gòu)如圖所示。

實(shí)例對(duì)象、類對(duì)象和元類的關(guān)系結(jié)構(gòu)圖

1)類方法屬于類對(duì)象,用“+”號(hào)修飾,它類似于C語(yǔ)言中的靜態(tài)方法,類方法列表定義在類對(duì)象的元類中,通過isa指針找到;實(shí)例方法屬于實(shí)例對(duì)象,用“-”號(hào)修飾,實(shí)例方法列表定義在實(shí)例對(duì)象的類對(duì)象中,通過isa指針找到。

2)類方法只能通過類對(duì)象調(diào)用,也就是類名直接調(diào)用;實(shí)例方法則需要由通過alloc和init方法實(shí)例化后的實(shí)例對(duì)象調(diào)用。

3)類方法中的self指類對(duì)象;實(shí)例方法中的self指實(shí)例對(duì)象。

4)類方法可以調(diào)用其他的類方法,但不可以直接調(diào)用實(shí)例方法;而實(shí)例方法既可以調(diào)用其他實(shí)例方法,也可以通過類名直接調(diào)用本類或者外部類的類方法。

5)在實(shí)例方法中可以訪問成員變量,但類方法中不能訪問成員變量。

5.

子類初始化時(shí)為什么要調(diào)用self=[superinit]?正確答案:因?yàn)樽宇惱^承自父類,需要獲得父類的實(shí)例和方法等,所以初始化子類之前要先保證父類已經(jīng)初始化完畢,防止出錯(cuò)。當(dāng)調(diào)用self=[superinit]方法時(shí),如果父類初始化不成功,那么會(huì)返回nil,所以可以根據(jù)self是否為nil判斷父類是否初始化成功,從而進(jìn)行合理地處理,以便起到容錯(cuò)效果。

6.

使用dealloc方法釋放對(duì)象時(shí),為什么一定要調(diào)用[superdealloc]方法?在何處調(diào)用?正確答案:因?yàn)樽宇惖暮芏鄬?shí)例變量是繼承自父類的,所以要調(diào)用[superdealloc]方法來釋放從父類繼承來的實(shí)例變量,實(shí)際上還是釋放自己的實(shí)例變量,只是繼承來的這部分只能調(diào)用父類的dealloc方法來釋放。

按照自下往上的邏輯,一般要先釋放子類的實(shí)例,然后釋放父類的實(shí)例。自下往上的原因是,在調(diào)用[superdealloc]方法之前如果不先把子類中的變量從內(nèi)存中釋放掉,容易造成子類中變量的內(nèi)存積壓,導(dǎo)致內(nèi)存泄漏,所以[superdealloc]方法應(yīng)該在釋放掉子類變量之后最后調(diào)用。當(dāng)然在ARC中就不需要考慮這些問題了,變量會(huì)自動(dòng)釋放,此方法也不存在了。

7.

#import與#include以及#import<>與#import""各有什么區(qū)別?正確答案:#import與#include都是用來引入頭文件的。與#include相比,Objective-C中#import的優(yōu)勢(shì)是不會(huì)引起重復(fù)包含,相當(dāng)于多了C/C++中#pragmaonce的作用,它可以保證頭文件只被編譯一次。

#import<>與#import""的區(qū)別和C/C++中#include<>與#include""的區(qū)別一樣:使用尖括號(hào)<>指用來引入系統(tǒng)的頭文件,而使用引號(hào)""指用來引入本地用戶頭文件。

8.

Objective-C中@class代表什么?正確答案:@class相當(dāng)于只是在頭文件聲明一下要用到的類的頭文件(前向聲明),告訴編譯器有這樣一個(gè)類的定義但暫時(shí)不要將類的實(shí)現(xiàn)引入,讓該類定義的變量能夠編譯通過,直到運(yùn)行起來時(shí)才去查看類的實(shí)現(xiàn)文件。但實(shí)際上這樣也只能起到在頭文件中聲明該類實(shí)例變量的作用,在.m文件中如果用到類的實(shí)現(xiàn)細(xì)節(jié)(屬性和方法),那么還是要通過#import再次引入類的頭文件。

使用@class的好處是將頭文件的引入延遲了,至少延遲到了.m實(shí)現(xiàn)文件中,這也符合“直到真正用到的時(shí)候再確定引入”的動(dòng)態(tài)思想,盡量往后拖延,更重要的是這樣也可以有效地避免頭文件的重復(fù)引入甚至循環(huán)引用等問題。

9.

Objective-C中有二維數(shù)組嗎?如何實(shí)現(xiàn)?正確答案:Objective-C中是沒有二維數(shù)組的。二維數(shù)組是通過一維數(shù)組的嵌套實(shí)現(xiàn)的,但是別忘了還有字面量用法,實(shí)際上可以像C/C++一樣簡(jiǎn)潔地創(chuàng)建和使用二維數(shù)組。這里總結(jié)了創(chuàng)建二維數(shù)組的兩種方法以及數(shù)組的訪問方式。

1)通過字面量創(chuàng)建和使用二維數(shù)組(推薦)方法如下:

/*字面量創(chuàng)建二維數(shù)組并訪問(推薦)*/

NSArray*array2d=@[

@[@11,@12,@13],

@[@21,@22,@23],

@[@31,@32,@33]

];

/*字面量訪問方式(推薦)*/

NSLog(@"array2d[2][2]:%@",array2d[2][2]);

/*數(shù)組對(duì)象訪問*/

NSLog(@"array2d[2][2]:%@",[[array2dobjectAtIndex:2]objectAtIndex:2]);

打印結(jié)果如下:

2017-01-0521:59:49.694SingleView[10483:506166]array2d[2][2]:33

2017-01-0521:59:49.695SingleView[10483:506166]array2d[2][2]:33

2)通過嵌套原本的數(shù)組對(duì)象使用二維數(shù)組方式如下:

/*另外一種循環(huán)嵌套創(chuàng)建二維數(shù)組的方式*/

NSMutableArray*mulArrayD1=[[NSMutableArrayalloc]init];

//第一維數(shù)組

/*添加第二維*/

for(NSUIntegeri=1;i<=3;i++){

NSArray*arrayD2=@[@(i*10+1),@(i*10+2),@(i*10+3)];

[mulArrayD1addObject:arrayD2];

}

/*字面量訪問方式(推薦)*/

NSLog(@"array2d[2][2]:%@",mulArrayD1[2][2]);

/*數(shù)組對(duì)象訪問*/

NSLog(@"array2d[2][2]:%@",[[mulArrayD1objectAtIndex:2]objectAtIndex:2]);

打印結(jié)果如下:

2017-01-0521:59:49.695SingleView[10483:506166]array2d[2][2]:33

1:59:49.695SingleView[10483:506166]array2d[2][2]:33

10.

在Objective-C的數(shù)組或字典中,添加nil對(duì)象會(huì)有什么問題?正確答案:數(shù)組或字典如果通過addObject方法添加nil,那么程序會(huì)崩潰,但如果使用initWithObjects方法來初始化數(shù)組,其中的nil會(huì)被編譯器過濾去掉,不會(huì)出現(xiàn)崩潰問題。另外,如果使用糖衣語(yǔ)法初始化數(shù)組或字典,那么也不可以有nil,此時(shí)nil不會(huì)被過濾掉也會(huì)導(dǎo)致程序崩潰。

/*1.糖衣語(yǔ)法*/

NSArray*array=@[@1,@2,@3,nil];//錯(cuò)誤,不可有ni1,會(huì)編譯不通過:void*不是Objective-C對(duì)象

NSDictionary*dic=@{

@"KEY":@"VALUE",

@"KEY1":@"VALUE1",

@"KEY2":nil

};//語(yǔ)法就是錯(cuò)誤的,編譯不通過

/*2.原用法*/

NSMutableArray*mulArray=[[NSMutableArrayalloc]initWithObjects:@1,@2,@3,nil];//正確

NSMutableDictionary*mulDic=[[NSMutableDictionaryalloc]initWithObjectsAndKeys:

@"VALUE",@"KEY",

@"VALU

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論