面试题

iOS面试进阶篇(五)

2019-03-17  本文已影响92人  路飞_Luck
目录
  • block原理及使用
  • 多线程方式
  • OC内存管理机制
  • 代理,通知的区别及使用场景
  • const,const,extern,volatile等关键字
1.定义block
typedef void(^animations)(void);
typedef void(^completion)(BOOL finished);
2.做过的项目是否涉及网络访问功能,使用什么对象完成网络功能?

ASIHTTPRequest与NSURLConnection

3.简单介绍下NSURLConnection类

NSURLConnection主要用于网络访问

+ sendSynchronousRequest:returningResponse:error:

是同步访问数据,即当前线程会阻塞,并等待request的返回的response

– initWithRequest:delegate:

使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。

4.多线程是什么

多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色;

5.iOS 中的多线程

iOS中的多线程,是Cocoa框架下的多线程,通过Cocoa的封装,可以让我们更为方便的使用线程,做过C++的同学可能会对线程有更多的理解,比如线程的创立,信号量、共享变量有认识,Cocoa框架下会方便很多,它对线程做了封装,有些封装,可以让我们创建的对象,本身便拥有线程,也就是线程的对象化抽象,从而减少我们的工程,提供程序的健壮性。

6.在项目什么时候选择使用GCD,什么时候选择NSOperation?
7.什么是block

对于闭包(block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解。

8.block 实现原理

Objective-C是对C语言的扩展,block的实现是基于指针函数指针

从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。

cocoaTouch框架下动画效果的Block的调用

typedef void(^didFinishBlock)(NSObject *obj); // 这就声明了一个didFinishBlock类型的block
@property(nonatomic,copy)didFinishBlock finishBlock;

1声明一个blokc对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。
2__block是一种特殊类型,

使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。

9.关于block

面试时,面试官会先问一些,是否了解block,是否使用过block,这些问题相当于开场白,往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答。

9.1使用block和使用delegate完成委托模式有什么优点?

首先要了解什么是委托模式,委托模式在iOS中大量应用,其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象,使委托模式更为简洁。了解委托模式的细节:

9.2 多线程与block

使用 dispatch_async 系列方法,可以以指定的方式执行block

dispatch_async的完整定义

void dispatch_async( dispatch_queue_t queue, dispatch_block_t block);

功能:在指定的队列里提交一个异步执行的block,不阻塞当前线程
通过queue来控制block执行的线程。主线程执行前文定义的 finishBlock对象

10.谈谈Object-C的内存管理方式及过程?
11.Object-C有私有方法吗?私有变量呢?
12.Object-C有多继承吗?没有的话用什么代替?cocoa 中所有的类都是NSObject 的子类
13.内存管理 Autorelease、retain、copy、assign的set方法和含义?
NSMutableArray aArray = [[NSArray alloc] init]; 
[aArray release];
[aArray retain] 
[aArray release];
obj2 = [[obj1 someMethod] autorelease];

对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时:你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉。但是在retain后,一定要在适当的时候进行释放。

关于索引计数(Reference Counting)的问题
14.C和obj-c 如何混用

如果模块以函数实现,那么头文件要按c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。

总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用 实现代 码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp

15.Objective-C堆和栈的区别?
16.什么时候用delegate,什么时候用Notification?
17.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在这想看到几件事情:

18.写一个”标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) (A) <=  (B) ? (A) : (B))

这个测试是为下面的目的而设的:

19.关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用

const 意味着"只读",下面的声明都是什么意思?

1. const int a;
  1. a是一个常整型数。
2. int const a;
  1. a是一个常整型数。
3. const int *a;
  1. 意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
4. int * const a;
  1. 是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
5.int const *a const;
  1. 意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

结论:
1.关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
2.如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

使用技巧

20.关键字volatile有什么含意?并给出三个不同的例子。

一个定义为 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:

21.一个参数既可以是const还可以是volatile吗? 一个指针可以是volatile 吗?解释为什么
22.static 关键字的作用:
23.线程与进程的区别和联系?
24.列举几种进程的同步机制,并比较其优缺点。
25.进程之间通信的途径

共享存储系统消息传递系统管道:以文件系统为基础

26.进程死锁的原因

资源竞争及进程推进顺序非法


更多同类型文章请参考

iOS面试进阶篇(一)
iOS面试进阶篇(二)
iOS面试进阶篇(三)
iOS面试进阶篇(四)
iOS面试进阶篇(五)


书写整理多不容易,觉得写的好的打赏一下吧。

上一篇 下一篇

猜你喜欢

热点阅读