版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
iOS程序員面試分類模擬2簡答題1.
objective-C的優(yōu)缺點有哪些?正確答案:Objective-C的優(yōu)缺點見表。Objective-C的優(yōu)缺點優(yōu)點缺點1)Objec(江南博哥)tive-C是C語言的超集,在C語言的基礎上衍生了很多新的語言特性,封裝得很完善而且方便使用,大大降低了編程復雜度,因此開發(fā)中使用起來會感覺方便高效1)不支持命名空間(都是通過加一些像NS或者UI這樣的命名前綴來達到用命名空間防止命名沖突的作用,但這樣會使變量的命名更長)2)Category(類別)的使用,可以快速擴展類的方法,同時使擴展的功能模塊之間互不影響2)不支持運算符重載3)Posing(扮演)特性,[ParentClassposeAs:[ChildrenClassclass]];該語言特性使得父類無須定義和初始化子類對象,即可通過父類扮演子類進行操作3)不支持多重繼承(C++語言通過virtual關鍵字防止二義性的出現,實現多重繼承)4)動態(tài)語言特性,動態(tài)類型、動態(tài)綁定和動態(tài)加載等,將類型確定、方法調用和資源加載等任務推遲到運行時,大大提高了編程靈活度4)使用動態(tài)運行時類型,所有的方法都是通過消息傳遞機制方法調用,有其動態(tài)的優(yōu)勢,同時也使很多編譯時的優(yōu)化方法無法使用降低了性能,例如:內聯方法等5)指針:Objective-C保留了C語言強大的指針特性
6)Objective-C與C/C++可在.mm文件中進行混合編程,靈活度更高
2.
相對于objective-C而言,Swift有什么新特性?正確答案:Swift是一門新型語言,它借鑒了Haskell、Ruby、Python、C#等語言特性,看上去偏腳本化。Swift仍然支持已有的Cocoa和CocoaTouch框架。
Swift的主要新特性如下:
1)安全:有嚴格的類型檢查。
2)強大:有高度優(yōu)化的LLVM編譯器。
3)新型:Swift借鑒多種語言特性,表達更簡單精確。
Swift與Objective-C和C/C++的基本對比見表。C/C++、objective-C和Swift三者基本對比
C/C++Objective-CSwift庫引入#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(){...}實例方法聲明intspeak();-(int)speak();funcspeak(){...}動態(tài)內存申請Person*person=malloc(sizeof(Person));Person*person=newPerson;Person*person=[Personalloc];Varperson=Person()類方法調用Person::speak();[Personspeak];Person.speak()實例方法調用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類的定義
整個類文件都定義在一個Swift文件內:
importFoundation
classBall{
/*變量*/
varcenterX:Float
varcenterY:Float
varradius:Float
/*初始化方法*/
init(centerX:Float,centerY:Float,radius:Float){
selfcenterX=centerX
self.centerY=centerY
self.radius=radius
}
/*實例方法*/
funcmove(moveX:Float,_moveY:Float){
self.centerX+=moveX
self.centerY+=moveY
}
/*類方法*/
classfuncaClassMethod(){
print("Iamaclassmethod")
}
}
...
/*創(chuàng)建對象*/
varball1=Ball(centerX:7.0,centerY:5.0,radius:6.0)
/*方法調用*/
ball1.move(moveX:1.0,1.0)
Ball.aClassMethod0
3.Objective-C和Swift語言中流程控制語句的比較
(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語言中String字符串的對比
(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語言中Array和MultableArray的對比
(1)Objective-C
/*靜態(tài)數組*/
NSArray*array=[[NSArrayalloc]initWithObjects:ball1,ball2,nil];
array[0].radius=10;
/*可變數組*/
NSMutableArray*mArray=[[NSMutableArrayalloc]initWithCapacity:2];
[mArrayaddObject:ball1];
[mArrayaddObject:ball2];
Ball*newball=[mArrayobjectAtIndex:1];
[mArrayremoveObjectAtIndex:1];
(2)Swift
/*靜態(tài)數組*/
letmyArray:Array<Ball>=[ball1,ball2]
letmyArray:[Ball]=[ball1,ball2]
letmyArray=[ball1,ball2]
myArray[0].radius=10
/*可變數組*/
vatmyArray:[Ball]=[]
myArray.append(ball1)
myArray.append(ball2)
varnewBall=myArray[1]
myArray.remove(at:0)
6.Objective-C和Swift語言中UIImageView的使用對比
(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對象與CoreFoundation對象有什么區(qū)別?正確答案:Foundation對象是Objective-C對象,使用Objective-C語言實現;而CoreFoundation對象是C對象,使用C語言實現。兩者之間可以通過__bridge、__bridge_transfer、__bridge_retained等關鍵字轉換(橋接)。
Foundation對象和CoreFoundation對象更重要的區(qū)別是ARC下的內存管理問題。在非ARC下兩者都需要開發(fā)者手動管理內存,沒有區(qū)別。但在ARC下,系統(tǒng)只會自動管理Foundation對象的釋放,而不支持對CoreFoundation對象的管理。因此,在ARC下兩者進行轉換后,必須要確定轉換后的對象是由開發(fā)者手動管理,還是由ARC系統(tǒng)繼續(xù)管理,否則可能導致內存泄漏問題。
下面以NSString對象(Foundation對象)和CFStringRef對象(CoreFoundation對象)為例,介紹兩者的轉換和內存管理權移交問題。
1)在非ARC下,NSString對象和CFStringRef對象可以直接進行強制轉換,都是手動管理內存,無須關心內存管理權的移交問題。
2)在ARC下,NSString對象和CFStringRef對象在相互轉換時,需要選擇使用__bridge、__bridge_transfer和__bridge_retained來確定對象的管理權轉移問題,三者的作用語義分別如下:
①__bridge關鍵詞最常用,它的含義是不改變對象的管理權所有者,本來由ARC管理的Foundation對象,轉換成CoreFoundation對象后依然由ARC管理;本來由開發(fā)者手動管理的CoreFoundation對象轉換成Foundation對象后繼續(xù)由開發(fā)者手動管理。示例代碼如下:
/*ARC管理的Foundation對象*/
NSString*s1=@"string";
/*轉換后依然由ARC管理釋放*/
CFStringRefcfstring=(__bridgeCFStringRef)s1;
/*開發(fā)者手動管理的CoreFoundation對象*/
CFStringRefs2=CFStringCreateWithCString(NULL,"string",kCFStringEncodingASCII);
/*轉換后仍然需要開發(fā)者手動管理釋放*/
NSString*fstring=(__bridgeNSString*)s2;
②__bfidge_transfer用在將CoreFoundation對象轉換成Foundation對象時,用于進行內存管理權的移交,即本來需由開發(fā)者手動管理釋放的CoreFoundation對象在轉換成Foundation對象后,交由ARC來管理對象的釋放,開發(fā)者不用再關心對象的釋放問題,因為不會發(fā)生內存泄漏。示例代碼如下:
/*開發(fā)者手動管理的CoreFoundation對象*/
CFStringRefs2=CFStringCreateWithCString(NULL,"string",kCFStringEncodingASCII);
/*轉換后改由ARC管理對象的釋放,不用擔心內存泄漏*/
NSString*fstring=(__bridge__transferNSString*)s2;
//NSString*fstring=(NSString*)CFBridgingRelease(s2);
//另一種等效寫法
③__bridge_retained用在將Foundation對象轉換成CoreFoundation對象時,進行ARC內存管理權的剝奪,即本來由ARC管理的Foundation對象在轉換成CoreFoundation對象后,ARC不再繼續(xù)管理該對象,需要開發(fā)者自己進行手動釋放該對象,否則會發(fā)生內存泄漏。示例代碼如下:
/*ARC管理的Foundation對象*/
NSString*s1=@"string";
/*轉換后ARC不再繼續(xù)管理,需要手動釋放*/
CFStringRefcfstring=(__bridge__retainedCFStringRef)s1;
//CFStringRefcfstring=(CFStringRef)CFBridgingRetain(s1);
//另一種等效寫法
4.
Objective-C中的類方法和實例方法有什么本質區(qū)別和聯系?正確答案:在比較類方法和實例方法的區(qū)別之前,先要明確Objective-C中的類對象和實例對象的概念,開發(fā)中定義的類自身也是一個對象,稱為類對象,保存該類的成員變量、屬性列表和方法列表等。類對象經alloc和init實例化后成為實例對象。實例對象、類對象和元類的底層結構如圖所示。
實例對象、類對象和元類的關系結構圖
1)類方法屬于類對象,用“+”號修飾,它類似于C語言中的靜態(tài)方法,類方法列表定義在類對象的元類中,通過isa指針找到;實例方法屬于實例對象,用“-”號修飾,實例方法列表定義在實例對象的類對象中,通過isa指針找到。
2)類方法只能通過類對象調用,也就是類名直接調用;實例方法則需要由通過alloc和init方法實例化后的實例對象調用。
3)類方法中的self指類對象;實例方法中的self指實例對象。
4)類方法可以調用其他的類方法,但不可以直接調用實例方法;而實例方法既可以調用其他實例方法,也可以通過類名直接調用本類或者外部類的類方法。
5)在實例方法中可以訪問成員變量,但類方法中不能訪問成員變量。
5.
子類初始化時為什么要調用self=[superinit]?正確答案:因為子類繼承自父類,需要獲得父類的實例和方法等,所以初始化子類之前要先保證父類已經初始化完畢,防止出錯。當調用self=[superinit]方法時,如果父類初始化不成功,那么會返回nil,所以可以根據self是否為nil判斷父類是否初始化成功,從而進行合理地處理,以便起到容錯效果。
6.
使用dealloc方法釋放對象時,為什么一定要調用[superdealloc]方法?在何處調用?正確答案:因為子類的很多實例變量是繼承自父類的,所以要調用[superdealloc]方法來釋放從父類繼承來的實例變量,實際上還是釋放自己的實例變量,只是繼承來的這部分只能調用父類的dealloc方法來釋放。
按照自下往上的邏輯,一般要先釋放子類的實例,然后釋放父類的實例。自下往上的原因是,在調用[superdealloc]方法之前如果不先把子類中的變量從內存中釋放掉,容易造成子類中變量的內存積壓,導致內存泄漏,所以[superdealloc]方法應該在釋放掉子類變量之后最后調用。當然在ARC中就不需要考慮這些問題了,變量會自動釋放,此方法也不存在了。
7.
#import與#include以及#import<>與#import""各有什么區(qū)別?正確答案:#import與#include都是用來引入頭文件的。與#include相比,Objective-C中#import的優(yōu)勢是不會引起重復包含,相當于多了C/C++中#pragmaonce的作用,它可以保證頭文件只被編譯一次。
#import<>與#import""的區(qū)別和C/C++中#include<>與#include""的區(qū)別一樣:使用尖括號<>指用來引入系統(tǒng)的頭文件,而使用引號""指用來引入本地用戶頭文件。
8.
Objective-C中@class代表什么?正確答案:@class相當于只是在頭文件聲明一下要用到的類的頭文件(前向聲明),告訴編譯器有這樣一個類的定義但暫時不要將類的實現引入,讓該類定義的變量能夠編譯通過,直到運行起來時才去查看類的實現文件。但實際上這樣也只能起到在頭文件中聲明該類實例變量的作用,在.m文件中如果用到類的實現細節(jié)(屬性和方法),那么還是要通過#import再次引入類的頭文件。
使用@class的好處是將頭文件的引入延遲了,至少延遲到了.m實現文件中,這也符合“直到真正用到的時候再確定引入”的動態(tài)思想,盡量往后拖延,更重要的是這樣也可以有效地避免頭文件的重復引入甚至循環(huán)引用等問題。
9.
Objective-C中有二維數組嗎?如何實現?正確答案:Objective-C中是沒有二維數組的。二維數組是通過一維數組的嵌套實現的,但是別忘了還有字面量用法,實際上可以像C/C++一樣簡潔地創(chuàng)建和使用二維數組。這里總結了創(chuàng)建二維數組的兩種方法以及數組的訪問方式。
1)通過字面量創(chuàng)建和使用二維數組(推薦)方法如下:
/*字面量創(chuàng)建二維數組并訪問(推薦)*/
NSArray*array2d=@[
@[@11,@12,@13],
@[@21,@22,@23],
@[@31,@32,@33]
];
/*字面量訪問方式(推薦)*/
NSLog(@"array2d[2][2]:%@",array2d[2][2]);
/*數組對象訪問*/
NSLog(@"array2d[2][2]:%@",[[array2dobjectAtIndex:2]objectAtIndex:2]);
打印結果如下:
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)通過嵌套原本的數組對象使用二維數組方式如下:
/*另外一種循環(huán)嵌套創(chuàng)建二維數組的方式*/
NSMutableArray*mulArrayD1=[[NSMutableArrayalloc]init];
//第一維數組
/*添加第二維*/
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]);
/*數組對象訪問*/
NSLog(@"array2d[2][2]:%@",[[mulArrayD1objectAtIndex:2]objectAtIndex:2]);
打印結果如下:
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的數組或字典中,添加nil對象會有什么問題?正確答案:數組或字典如果通過addObject方法添加nil,那么程序會崩潰,但如果使用initWithObjects方法來初始化數組,其中的nil會被編譯器過濾去掉,不會出現崩潰問題。另外,如果使用糖衣語法初始化數組或字典,那么也不可以有nil,此時nil不會被過濾掉也會導致程序崩潰。
/*1.糖衣語法*/
NSArray*array=@[@1,@2,@3,nil];//錯誤,不可有ni1,會編譯不通過:void*不是Objective-C對象
NSDictionary*dic=@{
@"KEY":@"VALUE",
@"KEY1":@"VALUE1",
@"KEY2":nil
};//語法就是錯誤的,編譯不通過
/*2.原用法*/
NSMutableArray*mulArray=[[NSMutableArrayalloc]initWithObjects:@1,@2,@3,nil];//正確
NSMutableDictionary*mulDic=[[NSMutableDictionaryalloc]initWithObjectsAndKeys:
@"VALUE",@"KEY",
@"VALU
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 磁粉探傷檢測技術方法詳解
- 2026屆北京市東城區(qū)高三上學期期末歷史試題(含答案)
- 石油工程考試題庫及答案
- 手衛(wèi)生規(guī)范考試題及答案
- 氣壓泵護理試題及答案
- 廣東省廣州市2026年九年級上學期期末物理試卷附答案
- 2026年大學大二(計算機科學與技術)計算機網絡階段測試試題及答案
- 2026年深圳中考數學考綱解讀精練試卷(附答案可下載)
- 昆山護理招聘題庫及答案
- 2026年深圳中考歷史三輪復習沖刺試卷(附答案可下載)
- 甘肅省酒泉市2025-2026學年高一上學期期末語文試題(解析版)
- GB/T 3634.1-2025氫氣第1部分:工業(yè)氫
- JJG 499-2021 精密露點儀檢定規(guī)程
- T-CPQS A0011-2022 二手車車況檢測及評估通則
- 吸毒的危害性后果
- 錄用通知(入職通知書)offer模板
- 畜禽屠宰加工工國家職業(yè)標準(征求意見稿)
- 倉儲內部考核管理辦法
- 建筑工程交通導改與組織方案
- 醫(yī)療器械維修知識考核試題庫及答案
- 春天綠化養(yǎng)護知識培訓
評論
0/150
提交評論