iOS程序员面试分类模拟2_第1页
iOS程序员面试分类模拟2_第2页
iOS程序员面试分类模拟2_第3页
iOS程序员面试分类模拟2_第4页
iOS程序员面试分类模拟2_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iOS程序员面试分类模拟2简答题1.

objective-C的优缺点有哪些?正确答案:Objective-C的优缺点见表。Objective-C的优缺点优点缺点1)Objec(江南博哥)tive-C是C语言的超集,在C语言的基础上衍生了很多新的语言特性,封装得很完善而且方便使用,大大降低了编程复杂度,因此开发中使用起来会感觉方便高效1)不支持命名空间(都是通过加一些像NS或者UI这样的命名前缀来达到用命名空间防止命名冲突的作用,但这样会使变量的命名更长)2)Category(类别)的使用,可以快速扩展类的方法,同时使扩展的功能模块之间互不影响2)不支持运算符重载3)Posing(扮演)特性,[ParentClassposeAs:[ChildrenClassclass]];该语言特性使得父类无须定义和初始化子类对象,即可通过父类扮演子类进行操作3)不支持多重继承(C++语言通过virtual关键字防止二义性的出现,实现多重继承)4)动态语言特性,动态类型、动态绑定和动态加载等,将类型确定、方法调用和资源加载等任务推迟到运行时,大大提高了编程灵活度4)使用动态运行时类型,所有的方法都是通过消息传递机制方法调用,有其动态的优势,同时也使很多编译时的优化方法无法使用降低了性能,例如:内联方法等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)强大:有高度优化的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(){...}动态内存申请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的区别

(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")

}

}

...

/*创建对象*/

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循环*/

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

//Dosomethinghere

}

/*while循环*/

while(count<10){

//Dosomethinghere

}

/*do-while循环*/

do{

//Dosomcthinghere

}while(count<10);

(2)Swift

/*条件判断*/

ifa<b{

//Dosomethinghere

}else{

//Doanotherthinghere

}

/*for循环*/

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

//Dosomethinghere

}

/*while循环*/

whilecount<10{

//Dosomethinghere

}

/*repeat-while循环*/

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

/*静态数组*/

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

/*静态数组*/

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对象有什么区别?正确答案:Foundation对象是Objective-C对象,使用Objective-C语言实现;而CoreFoundation对象是C对象,使用C语言实现。两者之间可以通过__bridge、__bridge_transfer、__bridge_retained等关键字转换(桥接)。

Foundation对象和CoreFoundation对象更重要的区别是ARC下的内存管理问题。在非ARC下两者都需要开发者手动管理内存,没有区别。但在ARC下,系统只会自动管理Foundation对象的释放,而不支持对CoreFoundation对象的管理。因此,在ARC下两者进行转换后,必须要确定转换后的对象是由开发者手动管理,还是由ARC系统继续管理,否则可能导致内存泄漏问题。

下面以NSString对象(Foundation对象)和CFStringRef对象(CoreFoundation对象)为例,介绍两者的转换和内存管理权移交问题。

1)在非ARC下,NSString对象和CFStringRef对象可以直接进行强制转换,都是手动管理内存,无须关心内存管理权的移交问题。

2)在ARC下,NSString对象和CFStringRef对象在相互转换时,需要选择使用__bridge、__bridge_transfer和__bridge_retained来确定对象的管理权转移问题,三者的作用语义分别如下:

①__bridge关键词最常用,它的含义是不改变对象的管理权所有者,本来由ARC管理的Foundation对象,转换成CoreFoundation对象后依然由ARC管理;本来由开发者手动管理的CoreFoundation对象转换成Foundation对象后继续由开发者手动管理。示例代码如下:

/*ARC管理的Foundation对象*/

NSString*s1=@"string";

/*转换后依然由ARC管理释放*/

CFStringRefcfstring=(__bridgeCFStringRef)s1;

/*开发者手动管理的CoreFoundation对象*/

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

/*转换后仍然需要开发者手动管理释放*/

NSString*fstring=(__bridgeNSString*)s2;

②__bfidge_transfer用在将CoreFoundation对象转换成Foundation对象时,用于进行内存管理权的移交,即本来需由开发者手动管理释放的CoreFoundation对象在转换成Foundation对象后,交由ARC来管理对象的释放,开发者不用再关心对象的释放问题,因为不会发生内存泄漏。示例代码如下:

/*开发者手动管理的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不再继续管理该对象,需要开发者自己进行手动释放该对象,否则会发生内存泄漏。示例代码如下:

/*ARC管理的Foundation对象*/

NSString*s1=@"string";

/*转换后ARC不再继续管理,需要手动释放*/

CFStringRefcfstring=(__bridge__retainedCFStringRef)s1;

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

//另一种等效写法

4.

Objective-C中的类方法和实例方法有什么本质区别和联系?正确答案:在比较类方法和实例方法的区别之前,先要明确Objective-C中的类对象和实例对象的概念,开发中定义的类自身也是一个对象,称为类对象,保存该类的成员变量、属性列表和方法列表等。类对象经alloc和init实例化后成为实例对象。实例对象、类对象和元类的底层结构如图所示。

实例对象、类对象和元类的关系结构图

1)类方法属于类对象,用“+”号修饰,它类似于C语言中的静态方法,类方法列表定义在类对象的元类中,通过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""各有什么区别?正确答案:#import与#include都是用来引入头文件的。与#include相比,Objective-C中#import的优势是不会引起重复包含,相当于多了C/C++中#pragmaonce的作用,它可以保证头文件只被编译一次。

#import<>与#import""的区别和C/C++中#include<>与#include""的区别一样:使用尖括号<>指用来引入系统的头文件,而使用引号""指用来引入本地用户头文件。

8.

Objective-C中@class代表什么?正确答案:@class相当于只是在头文件声明一下要用到的类的头文件(前向声明),告诉编译器有这样一个类的定义但暂时不要将类的实现引入,让该类定义的变量能够编译通过,直到运行起来时才去查看类的实现文件。但实际上这样也只能起到在头文件中声明该类实例变量的作用,在.m文件中如果用到类的实现细节(属性和方法),那么还是要通过#import再次引入类的头文件。

使用@class的好处是将头文件的引入延迟了,至少延迟到了.m实现文件中,这也符合“直到真正用到的时候再确定引入”的动态思想,尽量往后拖延,更重要的是这样也可以有效地避免头文件的重复引入甚至循环引用等问题。

9.

Objective-C中有二维数组吗?如何实现?正确答案:Objective-C中是没有二维数组的。二维数组是通过一维数组的嵌套实现的,但是别忘了还有字面量用法,实际上可以像C/C++一样简洁地创建和使用二维数组。这里总结了创建二维数组的两种方法以及数组的访问方式。

1)通过字面量创建和使用二维数组(推荐)方法如下:

/*字面量创建二维数组并访问(推荐)*/

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)通过嵌套原本的数组对象使用二维数组方式如下:

/*另外一种循环嵌套创建二维数组的方式*/

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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论