IOS归档|IOS归档 - IOS求职面试题

1. Objective-C的类可以多重继承么?可以采用多个协议么?

答:不可以多重继承,可以采用多个协议。

2. #import和#include的区别是什么? #import<> 跟 #import" "有什么区别?
#import能避免头文件被重复包含的问题:1) 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include。使用include要注意重复引用的问题:class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。2)#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。所以,#import比起#include的好处就是它避免了重复引用的问题。所以在OC中我们基本用的都是import。#import<> 包含iOS框架类库里的类,#import""包含项目里自定义的类。

3. Category是什么?扩展一个类的方式用继承好还是类目好?为什么?
答:Category是类目。用类目好,因为继承要满足a is a b的关系,而类目只需要满足a has a b的关系,局限性更小, 你不用定义子类就能扩展一个类的功能,还能将类的定义分开放在不同的源文件里, 用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

4. 延展是什么?作用是什么?
答:延展(extension):在自己类的实现文件中添加类目来声明私有方法。

5. 类实例(成员)变量的@protected,@private,@public声明各有什么含义?
@protected:受保护的,该实例变量只能在该类和其子类内访问,其他类内不能访问。@private:私有的,该实例变量只能在该类内访问,其他类内不能访问。@public:共有的,该实例变量谁都可以访问。

6. id声明的对象有什么特性?
-没有 * 号 -动态数据类型 -可以指向任何类的对象(设置是nil),而不关心其具体类型 -在运行时检查其具体类型 -可以对其发送任何(存在的)消息

7. 委托是什么?委托和委托方双方的property声明用什么属性?为什么?
- 委托:一个对象保存另外一个对象的引用,被引用的对象实现了事先确定的协议,该协议用于将引用对象中的变化通知给被引用对象。 - 委托和委托方双方的property声明属性都是assign而不是retain. - 为了避免循环引用造成的内存泄露。

#循环引用的问题这样理解: 比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。 现在让A和B互相引用(A有一个属性是B对象,属性说明是retain; B有一个属性是A对象,属性说明是retain),现在两个对象的引用计数都增加了1,都变成了2。现在执行[A release]; [B release]; 此时创建对象的main函数已经释放了自己对对象的所有权,但是此时A和B的引用计数都还是1,因为他们互相引用了。 这时你发现A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。 这就是所谓的循环引用的问题。 要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理。

8. 浅拷贝和深拷贝区别是什么?
- 浅层复制:只复制指向对象的指针,而不复制引用对象本身。 - 深层复制:复制引用对象本身。 #通俗的话将就是: 浅复制好比你和你的影子,你完蛋,你的影子也完蛋 深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

9. 内存管理的几条原则是什么?按照默认法则,哪些关键字生成的对象需要手动释放?哪些情况下不需要手动释放,会直接进入自动释放池?
- 当使用new、alloc或copy方法创建一个对象时,该对象引用计数器为1。 如果不需要使用该对象,可以向其发送release或autorelease消息,在其使用完毕时被销毁。- 如果通过其他方法获取一个对象,则可以假设这个对象引用计数为1, 并且被设置为autorelease,不需要对该对象进行清理,如果确实需要retain这个对象,则需要使用完毕后release。- 如果retain了某个对象,需要release或autorelease该对象,保持retain方法和release方法使用次数相等。 # >>> 使用new、alloc、copy关键字生成的对象和retain了的对象需要手动释放。 设置为autorelease的对象不需要手动释放,会直接进入自动释放池。

10. 怎样实现一个单例模式的类,给出思路,不写代码。
首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为nil- 提供工厂方法对该全局实例进行访问,检查该变量是否为nil,如果nil就创建一个新的实例,最后返回全局实例- 全局变量的初始化在第一次调用工厂方法时会在+allocWithZone:中进行,所以需要重写该方法,防止通过标准的alloc方式创建新的实例- 为了防止通过copy方法得到新的实例,需要实现-copyWithZone方法- 只需在此方法中返回本身对象即可,引用计数也不需要进行改变,因为单例模式下的对象是不允许销毁的,所以也就不用保留- 因为全局实例不允许释放,所以retain,release,autorelease方法均需重写

11. @class的作用是什么?
答:在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。-@class的作用是告诉编译器,有这么一个类,用吧,没有问题 - @class还可以解决循环依赖的问题,例如A.h导入了B.h,而B.h导入了A.h,每一个头文件的编译都要让对象先编译成功才行 - 使用@class就可以避免这种情况的发生

12. KVC是什么?KVO是什么?有什么特点?
- KVC是键值编码,特点是通过指定表示要访问的属性名字的字符串标识符,可以进行类的属性读取和设置- KVO是键值观察,特点是利用键值观察可以注册成为一个对象的观察者,在该对象的某个属性变化时收到通知

13. MVC是什么?有什么特性?
MVC是一种设计模式,由模型、视图、控制器3部分组成。– 模型:保存应用程序数据的类,处理业务逻辑的类– 视图:窗口,控件和其他用户能看到的并且能交互的元素– 控制器:将模型和试图绑定在一起,确定如何处理用户输入的类

14. 定义属性时,什么情况使用copy、assign、retain?
- 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float,double, char, 等等) - 使用copy: 希望获得源对象的副本而不改变源对象内容时,对NSString - 使用retain: 希望获得源对象的所有权时,对其他NSObject和其子类

15. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
- assign用于简单数据类型,如NSInteger,double,bool,retain和copy用于对象.- readwrite是可读可写特性;需要生成getter方法和setter方法时- readonly是只读特性只会生成getter方法 不会生成setter方法 ; 不希望属性在类外改变- assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;- retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1; -copy表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。-nonatomic非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic

16. id 声明的对象有什么特性?
答:Id声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;

17. Objective-C如何对内存管理的,说说你的看法和解决方法?
答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。

18. 内存管理的几条原则是什么?
谁申请,谁释放 遵循Cocoa Touch的使用原则;内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

19. 那些关键字生成的对象 需要手动释放?
答:关键字alloc 或new 生成的对象需要手动释放

20. 在和property结合的时候怎样有效的避免内存泄露?
答:设置正确的property属性,对于retain需要在合适的地方释放

21. 如何对iOS设备进行性能测试?
Product -> Profile -> Standard ->Time Profiler

22. Object-c的类可以多重继承么?可以实现多个接口么?
答:Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;

23. Category是什么?重写一个类的方式用继承好还是分类好?为什么?
答:Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

24. 描述一下iOS SDK中如何实现MVC的开发模式
MVC是模型、试图、控制开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。 所有的用户数据都是模型层,它应该独立于视图。 所有的ViewController都是控制层,由它负责控制视图,访问模型数据

25. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
线程创建有三种方法:使用NSThread创建、使用 GCD的dispatch、使用子类化的NSOperation, 然后将其加入NSOperationQueue; 在主线程执行代码,方法是 performSelectorOnMainThread, 如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone

26. iPhone5 的屏幕分辨率大小为 1136* 640 ?
答:屏幕分辨率:用于量度位图图像内数据量多少的一个参数。 通常表示成ppi(每英寸像素Pixel per inch)。 屏幕物理尺寸不变,分辨率越高,每单位面积内包含的细节(像素点)越多。

27. struct strA { int a; float b; char c; } expA; printf("%ld",sizeof(expA)); 输出结果为 12 ?
对于结构体来说,按成员中所占字节最大的是float类型,占用4个字节,一共有3个成员,所以总的占用字节为:4* 3 = 12.

28. @property语法中readonly/readwrite,atomic/nonatomic的作用,@dynamic的作用?
功能:让编译器自动编写一对与数据成员同名的方法声明来省去读写方法的声明。readwrite:同时产生setter\getter方法readonly:只产生简单的getter,没有setter。assign:默认类型,setter方法直接赋值,而不进行retain操作retain:setter方法对参数进行release旧值,再retain新值。copy:setter方法进行Copy操作,与retain一样atomic:原子性,它没有一个如果你没有对原子性进行一个声明(atomic or nonatomic),那么系统会默认你选择的是atomic。nonatomic:非原子性,是直接从内存中取数值,因为它是从内存中取得数据,它并没有一个加锁的保护来用于cpu中的寄存器计算Value,它只是单纯的从内存地址中,当前的内存存储的数据结果来进行使用。 在多线环境下可提高性能,但无法保证数据同步。

29. OSI(Open System Interconnection)开放式系统互联参考模型 把网络协议从逻辑上分为了7层,试列举常见的应用层协议。
- Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。 它为用户提供了在本地计算机上完成远程主机工作的能力。- FTP文件传输协议是TCP/IP网络上两台计算机传送文件的协议, FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。- 超文本传输协议 (HTTP-Hypertext transfer protocol) 是分布式,协作式,超媒体系统应用之间的通信协议。 是万维网(world wide web)交换信息的基础。- SMTP(Simple MailTransfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则, 由它来控制信件的中转方式,它帮助每台计算机在发送或中转信件时找到下一个目的地。- 时间协议(TIME protocol)是一个在RFC 868内定义的网络协议。 它用作提供机器可读的日期时间资讯。- DNS 是域名系统 (Domain NameSystem) 的缩写,是因特网的一项核心服务, 它作为可以将域名和IP地址相互映射的一个分布式数据库。- SNMP(Simple Network ManagementProtocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。- TFTP(Trivial FileTransfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议, 提供不复杂、开销不大的文件传输服务。端口号为69。

30. 网络传输层协议中,基于TCP/IP协议和UDP/IP的连接有什么区别?
- TCP:TransmissionControl Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。- UDP 是User DatagramProtocol的简称, 中文名是用户数据包协议,是OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。#面向连接:是指通信双方在通信时,要事先建立一条通信线路, 其有三个过程:建立连接、使用连接和释放连接。 电话系统是一个面向连接的模式,拨号、通话、挂机;TCP协议就是一种面向连接的协议。#面向无连接:是指通信双方不需要事先建立一条通信线路, 而是把每个带有目的地址的包(报文分组)送到线路上,由系统自主选定路线进行传输。 邮政系统是一个无连接的模式,天罗地网式的选择路线,天女散花式的传播形式; IP、UDP协议就是一种无连接协议。

31. 简述MVC模式中M、V、C分别指代什么及发挥的作用?
MVC开始是存在于Desktop(桌面)程序中的, - M是指数据模型, - V是指用户界面, - C则是控制器, 使用MVC的目的是将M和V的实现代码分离。 C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。视图是用户看到并与之交互的界面,视图没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表, 作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。模型表示企业数据和业务规则,模型返回的数据是中立的,就是说模型与数据格式无关, 这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。 它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

  1. 堆和栈的区别?
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
【IOS归档|IOS归档 - IOS求职面试题】申请大小:栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域
堆:是向高地址扩展的数据结构,是不连续的内存区域。
分配方式:堆都是动态分配的 ,动态分配由alloca函数进行分配
栈的动态分配由编译器进行释放,无需我们手工实现
32. kvc和kvo的区别?
- kvc:键值编码,是一种间接访问对象的属性,使用字符串来标示属性 - kvo:键值观察机制,提供了观察某一属性变化的方法

33. 线程和进程的区别?
答:主要不同的是操作系统资源管理方式 - 线程是一个进程中不同的执行路径,线程有自己的堆、局部变量 - 进程有独立的地址空间,一个线程死掉,整个进程就会死掉

34. 使用#import 而#import比起#include的好处是?
- 使用#import 而#import比起#include的好处就是不会引起重复包含。

35. 类别的作用?
答:有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类。 可以使用类别对该类扩充新的方法。#注意:类别只能扩充方法,而不能扩充成员变量。

36. 代理的作用?
#委托代理(degegate),目的是改变和传递控制链 顾名思义,把某个对象要做的事情委托给别的对象去做。 那么别的对象就是这个对象的代理,代替它来打理要做的事。 反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。委托机制是一种设计模式。

37. 链表和数组的区别在哪里?
二者都属于一种数据结构#从逻辑结构来看 1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。 当数据增加时,可能超出原先定义的元素个数; 当数据减少时,造成内存浪费; 数组可以根据下标直接存取。2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。 (数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素#从内存存储来看 1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组; 相反, 如果需要经常插入和删除元素就需要用链表数据结构了。

3.8. 写出输出结果
main(){ int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); }

答:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int *ptr=(int *)(&a+1); 则ptr实际是&(a[5]),也就是a+5原因如下:&a是数组指针,其类型为 int (*)[5]; 而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5],但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址, a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].

39. 写一个委托的interface
@protocol MyDelegate; @interface MyClass: NSObject { id delegate; }//委托方法@protocol MyDelegate- (void)didJobs:(NSArray *)args; @end

40. 写一个NSString类的实现
+(id)initWithCString:(const char *)nullTerminatedCStringencoding:(NSStringEncoding)encoding; + (id)stringWithCString: (const char*)nullTerminatedCString encoding:(NSStringEncoding)encoding { NSString *obj; obj = [selfallocWithZone: NSDefaultMallocZone()]; obj = [objinitWithCString: nullTerminatedCString encoding: encoding]; return AUTORELEASE(obj); }

41. 自动释放池是什么,如何工作?
答:当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。 它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。 当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

42. 类工厂方法是什么?
答:类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。 这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。 工厂方法可能不仅仅为了方便使用。 它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对象的分配信息。 类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。 虽然init...方法可以确认一 个类在每次程序运行过程只存在一个实例,但它需要首先分配一个“生的”实例,然后还必须释放该实例。 工厂方法则可以避免为可能没有用的对象盲目分配内存。

43. obj-c的优缺点objc
#优点: 1) Cateogies 2) Posing 3) 动态识别 4) 指标计算 5)弹性讯息传递 6) 不是一个过度复杂的 C 衍生语言 7) Objective-C 与 C++ 可混合编程#缺点: 1) 不支援命名空间 2) 不支持运算符重载 3) 不支持多重继承 4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。 (如内联函数等),性能低劣。

#>>>>>>> 持续更新中。。。

    推荐阅读