iOS面试题【附部分答案】

来源:互联网 发布:中国联通网络测速平台 编辑:程序博客网 时间:2024/05/17 22:10


问答题:

1.      两段代码共存于一个文件,编译时有选择的编译其中的一部分,请问如何实现?

答案:条件预编译:#if        #ifdef  #ifndef

                  #else      #else  #define

                  #endif     #endif #endif

 

作用,确保代码只被执行一次

有两种简单的办法可以实现:

在源码中使用条件编译语句,然后在程序文件中定义宏的形式来选择需

要的编译代码。

在源码中使用条件编译语句,然后在编译命令的命令中加入宏定义命令

来实现选择编译。

2.      .malloc()与 calloc()的区别?

 .malloc(sizeof)calloc(n,sizeof)

区别:malloc 分配内存空间会有系统残留值  calloc分配内存空间每次都会被初始化为0;

calloc函数与malloc函数的区别仅在于一次可以分配n块区域。

pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc

ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(structstu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps

 

 

3.      如何引用一个已经定义过的全局变量?

如果要引用的全局变量在同一文件内定义,则可以直接引用;如果要引用的全局变量在另外的C文件中定义,则有两种引用方式。第一种是使用#include包含声明了该全局变量的头文件,第二种是使用extern关键字在本文件中再次声明该全局变量。

 全局变量  static  extern 无修饰符

 局部变量  auto static  register 无修饰符

变量的生命周期

常量

存储空间

 

 

 

4.      截取字符串”20|http://www.621life.com“ 中 ‘|’字符前面及后面的数据,分别输出它们

1.
NSString * ptr = @"I am a man";
2.
NSArray * array = [ptr componentsSeparatedByString:@" "];//将字符串整体作为分割条件 返回值为NSArray不可变数组
3.
NSMutableArray * array1 = [NSMutableArray arrayWithArray:array];//若修改,则将NSArray转化为NSMutableArray
4.
NSArray * array2 = [ptr componentsSeparatedByCharactersInSet:[NSCharacterSet                                            characterSetWithCharactersInString:@", "]];//以字符串中的字符作为分割条件进行分割

 

 

5.      请简述沙盒中3个文件夹的作用。

  1 、Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。此文件夹内容会被同步到icloud

 

  2、Library:存储程序的默认设置或其它状态信息;(Library下的Caches文件夹:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除)。

 

  3、tmp:提供一个即时创建临时文件的地方。

1.缓存 轻量化 (增 删 改  查)

2沙盒

3归档

4数据库

5coredata

 

6keychain 钥匙串

 

6.      怎样启动一个新的线程,子线程怎么刷新UI?

异步串行,并行的方式

使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;

同步:不会开辟新线程    dispatch_sync

 

 异步:开辟新线程       dispatch_async

串行:必须等待前一个任务完成才会继续执行下一个任务 

 dispatch_queue_t queue=dispatch_queue_create("test",NULL);

 

 并行:可以多个任务同时执行  

 dispatch_queue_t queue=dispatch_get_global_queue(0, 0);

 

子线程回到主线程更新UI

 

论述题:

1.      简述obj-c的优缺点 

动态类型 可以让你的代码在运行时判断对象的类型。id 数据类型可以在运行时用任何数据类型来替换。所以,你可以让运行时因素来决定代码中用到的对象是什么类型。动态类型让你的应用更加灵活,这是静态类型做不到的,不过这会让数据的严格统一性降低。。

2.      类别和类扩展的区别。

类别一组方法 对当前类的拓展。。。 类别 无属性 只有方法

类别是类的扩展,只可以声明方法,不可以声明变量。并且,类别的方法优先级较高,可覆盖原类方法。类别的方法中,不可以调用super方法

类目(category):为已知的类添加新的方法,哪怕你拿不到已知类的源代码,已知的类包括自己定义的类和系统已有的类。

类目的作用主要有三个方面:1、将类的实现分散到多个不同的文件中,将多个类目的声明放入同一个.h文件中,将实现放入多个.m方法中。2、使用类目创建对私有方法的前向引用,就是为类创建私有方法

延展定义私有方法category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。

类扩展;匿名类目 有属性 还有方法。。。

  extensions可以认为是一个私有的Category

3.      oc中的协议和java中的接口概念有何不同?

 OC中的代理有2层含义,官方定义为 formal和informalprotocol。前者和Java接口一样。

  informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。

  其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里

  “非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。

  这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。

  这么看,总觉得类别这玩意儿有点像协议的可选协议。”

  现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,

  现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。

4.      线程与进程的区别和联系?

一个进程包含多个线程  进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

5.      解释一下KVC和KVO,什么是键-值,键路径是什么?

答案:kvc:键 – 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。

  很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。

  kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。

  具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。

  比如我自定义的一个button

  [self addObserver:self forKeyPath"highlighted" options:0context:nil];

  #pragma mark KVO

  - (void)observeValueForKeyPathNSString *)keyPath ofObjectid)objectchangeNSDictionary *)change contextvoid *)context

  {

  if ([keyPath isEqualToString"highlighted"] ) {

  [self setNeedsDisplay];

  }

  }

  对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。

  对于kvc机制如何通过key寻找到value:

  “当通过KVC调用对象时,比如:[self valueForKey”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id)valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

  (cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)

  设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“

  来至cocoa,这个说法应该挺有道理。

  因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,

  可以按照kvc查找的逻辑理解,就说的过去了。

 

编程题:

1.设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

2. 获取沙盒Document 的目录,并且写入一个word文档。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

 

NSString *path =[paths objectAtIndex:0];

 

NSLog(@"path:%@",path);//document路径

NSString*filepath=[docpath stringByAppendingString:@"论文.docx"];

    NSFileManager *fileM=[NSFileManagerdefaultManager];

   

    if ([fileM fileExistsAtPath:filepath]==NO ){

       

        [fileM copyItemAtPath:bundlepathtoPath:filepath error:nil];

       

    }

    NSLog(@"%@",NSHomeDirectory());

 

 

 

3.用系统方法发送一个同步的http get请求,并处理结果;再用一个AFNetwork的方法发送一个异步http post请求。

 

人事题:

1.      自我介绍(3分钟)。

各位面试官。你们好,今天能够站在这里参加面试,有机会向各位考官请教和学习,我感到非常的荣幸。希望通过这次面试能够把自己展示给大家,希望大家记住我 ,我叫…今年23岁,软件开发专业 本科。我平时喜欢看书和上网浏览信息;我的性格比较开朗、随和。能关心周围的事务,和亲人朋友能够和睦相处,并对生活充满了信心,在外地求学的两年中使我养成了坚强的性格,这种性格使我克服了在学习和生活中的一些困难。我曾经在“  ”进行了为期5个月的实习,如果我有机会被录用的话。我想我一定能够在工作中得到锻炼并实现自身的价值。同时,我也认识到人和工作的关系是建立在自我认知的基础上的,我认为我有能力也有信心做好这份工作。





 

2.      你是什么时候开始从事iOS开发的?

对于iOS的开发起源于初入大学时的object-c选修课程,在课上,老师带我们做了一个当时算是很流行的小游戏,汤姆猫,第一次发现原来软件开发可以这么有趣,从此我时不时地在网上找找资料。学习博客,遇到问题时,会向同学,老师询问。


3.      说说你的业余爱好?

在空闲时间,我喜欢逛技术网站,论坛,了解一些新技术,在技术上的一些感悟,和难搞的问题的解决我通常会在博客上记录下来,因为我认为写博客是

兴趣使然、有感而发,记录下来的都是瞬间的灵感和对事物的感悟,都是思考的结果,在博客上,我可以记录下自身学习的成长历程。还能和遇到同样问题的伙伴交流自己的想法,看看别人的活法,你会受到启发;你有困难或忧愁,博友们相互排忧解难。有朋友帮助,何愁之有?分享就是快乐!


4.      如果美工设计的图有问题,怎么去沟通,说服美工改图?

参考: https://baike.1688.com/doc/view-d37040284.html

 
1 0
原创粉丝点击