iOS面试题

第一部分 C语言面试试题选集 7
1.int a = -45; a的二进制值是?八进制? 7
2.堆和栈的区别? 7
3.请简述文字编码:gb2312.Unicode.utf-8的编码方式? 7
4.static 关键字的作用? 8
5.解释下列变量a的定义? 8
6.以下程序输出的结果是什么? 8
7.找出下三段代码的错误: 9
8.写一算法进行排序。排序数字为{9,6,3,5,8,7} 10
9.有一块木头,长30米,短的一截是长的一截的3/5,长的一截有多少米? 10
10. 选择题 10
11.链表与数组的区别 10

第二部分 Objective-C与UI面试试题选集 11

1.类别和类扩展的区别? 11
2.Objective-C的类可以多重继承吗?可以实现多个接口吗?category是什么? 11
3.Objective-C属性特性 (assign,retain,copy,readonly,readwrite,atonmic,nonatomic) 11
4.自动释放池是什么,如何工作? 12
5.写代码,完成下列内容 12
6.Object-C如何对内存管理的,说说你的看法和解决办法?ARC 和 None-ARC的内存管理的区别在哪里? 12
7.介绍一下协议与类别 13
8.委托(代理)有什么作用?代理怎么实现,请简单代码举例? 13
9.描述一个你遇到过得retain cycle例子 13
10.#import 和 #include的区别 @class? 14
11.使用self.name = @“object”; 和 _name = @“object” 有什么不同吗? 14
12.请简述self.name = nil 的机制,以及与[_name release]的区别? 14
13.协议标准宏MIN,这个宏输入两个参数并返回较小的一个 14
14.线程与进程的区别和联系? 15
15.请解释一下iOS应用的沙盒机制? 15
16.Objective-C中的数字对象有哪些,简述他们与基本数据类型的区别? 15
17.Swift和Object-C分别是什么?两者比有什么不同之处,又有何联系? 16
18.类的定义及声明文件以什么为后缀名? 16
19.iOS UI的图像存储类型是什么? 16
20.这段代码有什么问题? 16
21.什么时候用NSMutableArray,什么时候使用NSArray? 16
22.同步调用和异步调用分别是什么? 16
23.NSString 和NSMutableString有什么区别? 17
24.frame和bounds的区别?bounds的大小改变frame改变吗? 17
25.UIViewController的生命周期方法调用顺序 17
26.介绍一下你对面向对象概念的理解? 18
27.重载和覆盖的区别。重载的方法是否可以改变返回值的类型? 18
28.UIView的圆角属性设置方法 19
29.请解释以下两种设计模式:工厂模式,单例模式 19
30.什么是MVC? 19
31.在.m文件Class Extension中声明的私有方法,其他类能否调用?若强行调用会发生什么? 20
32.在调用支付宝接口支付时,partner,seller,private分别是什么意思? 20
33.谈谈如何在MVC模式中减轻ViewController的重量(减少代码) 20
34.为什么很多内置的类,如TableViewController的delegate的属性是assign不v是retain? 20
35.列举几个你曾经用过的第三方库? 20
36.用宏定义来写出一个判断系统是否是iOS7以上的版本的例子 21
37. Objective-C的动态性体现在哪些方面 21
38.下面的代码会造成什么问题 21
39. ios平台怎么做数据的持久化?coredata 和sqlite有无必然联系?coredata是一个关系型数据库吗? 21
40.多线程中堆与栈分别是共有的还是私有的?(记住) 22
41.Objective-C 声明一个类所有要用到的编译指令是? 22
42.用预编译指令#define 声明一个常数,用以表示1年中有多少秒(忽略闰年问题) 22
43.解析XML文件有哪几种方式? 22
44.下面哪个方法不属于NSObject的内省(Introspection)方法 22
45.iOS 开发中,开发证书根据用途划分可以分为哪两大类,分别作用是什么用途? 22
46.关键字const有什么含义?static的作用?还有extem C的作用? 23
47.让一个物体从界面中的一点运动到另外一点,有哪些方法? 23
48.什么是多继承? 23
49.ViewController 的loadView,viewDidLoad,didReceiverMemoryWarning分别是什么时候调用的,在初始化ViewController时在这几个函数中应该做什么工作? 23
50.对于语句 NSString * obj = [[NSData alloc] init];obj在编译时是和运行时分别是什么对象? 24
51.什么时候用delegate,什么时候用Notification? 24
52.浅赋值和深赋值的区别。 24
53.介绍下KVC和KVO 24
54.多线程实现的三种方式 25
55.谈谈对Block的理解? 25
56.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢?为什么? 25
57.写一个单例(任意语言编写) 25
58.常见的数据持久化方法有哪些? 26
59.简述tableView的重用机制。 26
60.实例化一个UITableView对象,要求写出关键语句? 27
61.描述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理? 27
62.什么是 method swizzling?(了解) 27
63.Cocoa Touch 包含什么? 不包含什么? 27
64.响应链(Responder chain)是什么?它是如何发挥作用的? 28
65.如何获取项目根路径,并在其下创建一个名称为userData的目录 28
66.iPhone5,6,6+以及iPad Air 2的屏幕分辨率分别是多少? 28
67.分辨率的计算单位是什么? 28
68.UIButton的父类是什么? 28
69.请解释一下Interface Bulder的作用以及NIB文件的概念 29
70.选项卡(Tab Bar)和工具栏(Toolbar)分别是什么?两者之间 有何共同点和不同点 29
71.数据库中索引的作用?和它的优缺点是什么? 29
72.UIImageView如何响应点击事件? 29
73.如何实现UIScrollView无限滚动? 29
74.多线程中,访问同一变量,如何加锁? 30
75.写一个委托的 interface 30
76.UITableview的执行流程是怎么样的? 31
77.简述XMPP中有哪些节点,各个节点分别有什么作用? 31
78.使用AVPlayer播放视频时,视频监听的AVPlayerItem状态有几种,分别是什么及作用? 31
79.简述使用CLLocationManager定位时,如何停止定位? 31
80.iOS中有几种消息机制,区别以及各种机制的使用场景 (很全面哦) 31
81.UI布局的几种方式,各种方式的利弊谈谈您的看法 31
82.你用过NSOperationQueue吗?请描述它和GCD的区别和类似的地方 32
83.HTTP和Socket的区别? 32
84.Core Foundation中提供了哪几种操作Socket的方法? 32
85.请描述Xcode打包签名机制中Certificates & Identifiers & Provisioning Profiles三者的关系? 32
86.iCloud包含了哪些技术与服务? 33
87.UITableView需要实现那些代理?请列出UITableVIew代理中必须实现的与其他一些常用函数? 33
88.Objective-c有私有方法没,有私有变量吗? 33
89.UITableView 重新加载数据有几种方式?那种更好?如何对UITableView优化? 34
90.App crash后,有哪些调试方法? 34
91.谈谈你对NSRunLoop的理解; 34
92.自动布局(Auto layout)的作用是什么? 请概括一下它是如何运行的; 35
93.UILabel是否可以显示html文本,如果可以怎么显示? 35
94.如果现在需要让UILabel进行交互,(可以点击响应事件),有哪些方式? 35
95.数据库中有三张表 36
96.举例说明如何在多台机器上共享开发证书 36
97.举例说明,当需要将一个从未配置的过签名的APP发布到APPStore上时,配置签名过程。 36
98.如何设计一个可变高度(根据内容适应高度)的UITableViewCell? 36
99.一瓶啤酒一块钱,两瓶空瓶子可以换一瓶啤酒,现在你有20块钱,问你总共能喝多少瓶啤酒? 37
100. UIView与CLayer有什么区别? 37
101. What is push notification? (什么是推送通知) 37
102.What is Polymorphism? 38
103.What is Singleton? 38
104.What is responder chain? 38
105.Difference between frame and bounds? 38
106.Difference between method and selector? 38
107.Is there any garbage collection mechanism in Objective-C? 38
108.What is NSOperation queue? 38
109.What is lazy loading? 39
110.Can we use two tableview controllers on one viewcontroller? 39
111.What is block? Please write a simple example to block; 39

第一部分 C语言面试试题选集

1.int a = -45; a的二进制值是?八进制?
答:
二进制:-101101
八进制:-55

2.堆和栈的区别?
答:
a.堆栈空间分配区别:
栈:由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,先进后出。
堆:一般由开发人员分配释放,若开发人员不释放,程序结束时由系统回收,分配方式类似于链表,堆区用来开辟的空间和回收空间的操作分别是malloc和free。

b.内存分配和读取效率区别:
栈:栈由系统自动分配,速度快,但是程序员无法控制。
堆:堆是由程序员自己分配,速度较慢,容易产生碎片,不过用起来方便,非常灵活。

c.申请大小不同:
栈:栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。

3.请简述文字编码:gb2312.Unicode.utf-8的编码方式?
答:
GB2312:编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了
解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。

4.static 关键字的作用?
答:
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍保存上次的值;
(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

5.解释下列变量a的定义?
a. int *a[10];
b. int (*a)[10];
c. int (*a)(int);
d. int (*a[10])(int);
答案:
a. 定义一个存放10个整型指针变量的数组。
b. 定义一个用来存放包含10个元素的整型数组的首地址的指针变量。
c. 定义一个用来指向返回值是int,并且有一个参数,参数类型为int的函数指针。
d. 定义一个用来存放10个指向返回值是int,并且有一个参数,参数类型为int的函数指针的指针数组。

6.以下程序输出的结果是什么?

main()
{
int a[5] = {1,2,3,4,5};
int ptr = (int )(&a+1);
printf(“%d,%d”,(a+1),(ptr - 1));
}

答:2和5。&a为取数组名的地址,即为整个数组的地址,它的类型为数组类型,(int*)(&a+1)将其强制转换成整型指针赋值给ptr,并指向了数组界外,最后用(ptr-1)又指向了界内的最后一个元素5。&a + 1增加的是整个数组的大小(20),而a + 1增加的是一个元素的大小(4)。

7.找出下三段代码的错误:
void test()
{
char string[10];
char * str1 = *0123456789;
strcpy(string,str1);
}

void test2()
{
char string[10],str1[10];
int i;
for(i = 0;i < 10,i++) {
str1 = ‘a’;
}
strcpy(string,str1);
}

答:
void test()
{
char string[10];
char * str1 = *0123456789;//此处字符串定义错误,应使用双引号
strcpy(string,str1);//注意strcpy特点,后面\0字符串11位越界
}

void test2()
{
char string[10],str1[10];
int i;
for(i = 0;i < 10,i++) {
str1 = ‘a’;//数组名是常量地址,不允许赋值。
}
strcpy(string,str1);
}

8.写一算法进行排序。排序数字为{9,6,3,5,8,7}
答:
void bubbleSort(int a[], int n) {
NSArray *a = @[9, 6, 3, 5, 8, 7]
int n = a.count;
BOOL flag = YES;
for (int i = 0; i < n - 1 && flag; i++) {
flag = NO;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = YES;
}
}
}
}

9.有一块木头,长30米,短的一截是长的一截的3/5,长的一截有多少米?
答: 30 / 8 * 5 = 18.75

  1. 选择题
    有三个数 a, b, c,其中满足 a + b > c, b + c > a, a + c > b, 那么下列式子正确的是( )
    a > b > 0 B. a + b + c > 0 C.bc > ab D. c < a < b < 0
    答案: B, 三个式子相加, a + b > c, b + c > a, a + c > b, 得出2a + 2b + 2c > a + b + c, 再得出 2a + 2b + 2c - a- b- c > 0, 最终得出a + b + c > 0。

11.链表与数组的区别
答:链表和数组都可用来存放指定的数据类型。
链表的特性是在中间任意位置添加删除元素的都非常的快,不需要移动其它的元素。通常链表每一个元素都要保存一个指向下一个元素的指针(单链表)。双链表的话每个元素即要保存到下一个元素的指针,还要保存一个上一个元素的指针。循环链表则把最后一个元素中保存下一个元素指针指向第一个元素。
数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,这个编号叫做下标,我们可以通过下标来区别这些元素。数组元素的个数有时也称之为数组的长度。

第二部分 Objective-C与UI面试试题选集

1.类别和类扩展的区别?
答:
类别(Category)和类扩展(Extensions)都可用来为类扩充功能。
类别:可以为有源代码的类和无源代码的类扩充功能,而且只能添加方法,方法必须实现。子类可继承,可直接访问。
类扩展:只能为有源代码的类扩充功能。不光可以扩充实例变量,也可以扩充方法,但是方法和实例变量都是私有的。子类可继承,但是不可直接访问。

2.Objective-C的类可以多重继承吗?可以实现多个接口吗?category是什么?
答:
Objective-c的类不可以多重继承,只允许单根继承。
可以实现多个接口,通过实现多个接口可以完成多重继承;
Category是类别,可以为有源代码的类和无源代码的类扩充功能,而且只能添加方法,方法必须实现。子类可继承,可直接访问。

3.Objective-C属性特性 (assign,retain,copy,readonly,readwrite,atonmic,nonatomic)
答:
assign:用于基本数据类型,直接赋值。也可以用于对象,只不过当setter方法赋值时,只是简单存储地址,不会造成引用计数的改变,可以解决循环引用问题。
retain:用于对象类型,当赋值时,先将旧值释放,对新值retain引用计数加1
copy:用于对象类型,根据实现的NSCopying协议的copyWithZone:方法的不同,可以实现伪拷贝,浅拷贝,深拷贝。
readwrite: 可读可写特性。 当属性生成方法时,既生成setter方法,也生成getter方法。
readonly :只读特性 。当属性生成方法时,只会生成getter方法, 不会生成setter方法。
nonatomic :非原子性访问,当调用setter以及getter方法访问实例变量时,不会保证线程安全,但是访问效率高。
atomic:原子性访问,当调用setter以及getter方法访问实例变量时,会加多线程处理,访问时加锁,访问结束解锁,安全性高,但是访问效率低。

4.自动释放池是什么,如何工作?
答:自动释放池提供了一个对象容器,每次对象发送autorelease消息时,对象的引用计数并不真正变化,而是向自动释放池中添加一条记录,记下对象的这种要求。直到当自动释放池发送drain或release消息时,即当池被销毁前会通知池中的所有对象,全部发送release消息才会真正将引用计数减少。简单说自动释放池可以自动管理对象释放问题,这些语句必须要放在下面语句之间,直到池被释放,一个对象要想纳入内存释放池对象,必须要发送autorelease。

5.写代码,完成下列内容
写一个setter方法用于完成@property (nonatomic,retain) NSString * name;
写一个setter方法用于完成@property (nonatominc,copy) NSString * name;
答:
@property (nonatomic, retain) NSString * name
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name retain];
}
}
@property (nonatominc, copy) NSString * name;
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}

6.Object-C如何对内存管理的,说说你的看法和解决办法?ARC 和 None-ARC的内存管理的区别在哪里?
答:
OC采用引用计数机制来管理堆区内存,有两种内存管理方式,ARC和MRC,但是本质上都是基于引用计数机制的。
内存管理原则:只要对一个对象进行了alloc,retain,copy,mutableCopy之后,就拥有了该对象的所有权,必须对应release或者autorelease。要保证该对象引用计数增加的次数等于引用计数减少的次数,达到平衡。有效解决堆区的三大问题,内存泄露,野指针异常,过度释放。
ARC与MRC的区别:本质上都是基于引用计数机制的,但是MRC造成引用计数加1之后需要手动显示添加造成引用计数减少的代码, 而ARC会自动管理,无需添加。

7.介绍一下协议与类别
答:协议(Protocol):声明一系列的方法,没有方法的实现,可由任何类实现,只需要让该类服从该协议即可。简单的说,协议就是定义了一个接口,其他类负责来实现这些接口。如果你的类实现了一个协议的方法时,则说该类遵循此协议。
类别(category):类别是Objective-C的一项功能,可扩展类的接口,而无需对类进行子类化。category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况
下,为该类增加方法。如果我们想增加某个框架(framework)中的类的方法,category 就非常有效。但是类别只能扩充方法,不能扩充实例变量。

8.委托(代理)有什么作用?代理怎么实现,请简单代码举例?
答: 委托就是一个对象让另一个对象替他执行一定的动作,而代理所执行所有的任务来自于委托方指定的协议,代理需要服从协议,实现协议中的方法来完成任务。
①定义两个类 A类和B类。
②A中定义协议ADelegate,协议中存放代理需要执行的任务。
③在A类中添加代理属性,@property (nonatomic, assign) id delegate;
④创建对象A *a = [[A alloc] init], B *b = [[B alloc] init]; 并且指定代理 a.delegate = b;
⑤B类服从协议,并且实现协议中的方法。 B
⑥A类在合适时机让代理执行协议中的任务。

9.描述一个你遇到过得retain cycle例子
答:
①在该类中定义了block属性,并且在该block块中使用了self,实例变量,属性,就会造成循环引用。
②在该类定义了代理属性,但是代理属性的语义特性为retain。 在代理对象类中也定义了属性来存储该类的对象,语义特性也是retain,就会造成互相保有,循环引用。
③在A中定义了B类对象的属性,语义特性为retain。 并在B类中定义了A类对象的属性,语义特性为retain。 当属性都存储对应的对象时,就产生的循环引用。

10.#import 和 #include的区别 @class?
答:

import和#include都是用来导入头文件,只不过#import多用于OC中导入头文件,而#include多用于C语言中。 #import比#include更加智能,无论将同一个头文件导入多少次,#import只会导入一次,而#include会导入多次,从而会产生重复导入,而#import

不会。
@class的作用是声明后面的字符串可以当做类名使用,比如:@class A,A可以当做类名使用,但是A不具备该类的功能。如果想使用该类的功能,必须要在.m文件中使用#import导入头文件。
@class和#import结合可以避免循环导入问题。

11.使用self.name = @“object”; 和 _name = @“object” 有什么不同吗?
答:
self.name = @“object”, 是调用属性生成的setter方法,该属性的语义特性如果为retain,会先判断该对象和实例变量_name之前的值是否一致,如果不一致,先将之前对象release,再将新对象retain,引用计数加1,拥有所有权。
而_name = @“object”. 只是实例变量的简单赋值,用来存储对象的地址而已,引用计数不会发生任何变化。

12.请简述self.name = nil 的机制,以及与[_name release]的区别?
答:
self.name = nil; 是调用属性生成的setter方法,会先将原有对象释放release,然后将实例变量的值置为nil,以后在访问该实例变量不会出现任何内存问题。
而[_name release]; 只是简单的将对象的引用计数减1,而指针变量中依然存储该对象的地址,如果此时该对象空间被系统回收了,再访问实例变量,就会产生野指针异常。

13.协议标准宏MIN,这个宏输入两个参数并返回较小的一个
答:
简单版:#define MIN(A,B) ((A) <= (B)? (A) : (B))
升级版: #define MIN(A,B) ({typeof(A) a = A; typeof(B) b = B; a < b ? a : b })
牛逼版:

define NSX_PASTE(A,B) A##B

define NSMIN_IMPL(A,B,L) ({ typeof(A) NSX_PASTE(a,L) = (A); __typeof(B) NSX_PASTE(b,L) = (B); (__NSX_PASTE(a,L) < __NSX_PASTE(b,L)) ? __NSX_PASTE(a,L) : __NSX_PASTE(__b,L); })

#define MIN(A,B) __NSMIN_IMPL__(A,B,__COUNTER__)

14.线程与进程的区别和联系?
线程是指进程内的一块执行单元,也是执行任务的基本单位。
与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间。
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
(3)线程是处理器调度的基本单位,但进程不是。
(4)二者均可并发执行。

15.请解释一下iOS应用的沙盒机制?
答:iOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
1.每个应用程序都在自己的沙盒内
2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
3.应用程序向外请求或接收数据都需要经过权限认证

16.Objective-C中的数字对象有哪些,简述他们与基本数据类型的区别?
答:
OC中的数字对象NSNumber,NSValue。
NSNumber是OC中的对象类型,能够实现将基本数据类型int,float转成OC的对象。
NSValue是OC中的对象类型,能够实现将结构体类型CGPoint,NSRange转成OC的对象。

17.Swift和Object-C分别是什么?两者比有什么不同之处,又有何联系?
答:参考链接:http://www.imooc.com/wenda/detail/4752

18.类的定义及声明文件以什么为后缀名?
答:
类的定义分为声明和实现部分。
声明部分即为声明文件,以.h为后缀。
类的实现以.m为后缀。

19.iOS UI的图像存储类型是什么?
答:UIImage

20.这段代码有什么问题?
@implementtation Person
- (void)setAge:(int)newAge {
self.Age = newAge;
}
答:self.Age = newAge;再次调用了setter方法,引起了循环调用,造成死循环。

21.什么时候用NSMutableArray,什么时候使用NSArray?
答:
NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域,一旦初始化,不能通过它对该内存区域的数据进行修改操作,但是它可以读数据NSMutableArray是动态的是NSArray的子类,可以对所指向的内存区域内容进行更改,并可以增加数组内容。
总结:当数组对象创建好之后,后期想要更改数组的内容,则使用NSMutableArray。否则使用NSArray。

22.同步调用和异步调用分别是什么?
答:
同步:我们把异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步,往往这种情况,任务与任务之间存在依赖关系,后一个任务的执行依赖于前一个任务的结束。
异步:任务与任务之间不存在任何依赖关系,任务并发执行,最后执行的任务可能第一个执行结束。

23.NSString 和NSMutableString有什么区别?
答:
NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。
而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。

24.frame和bounds的区别?bounds的大小改变frame改变吗?
答:
frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
bounds的大小改变frame也会改变。只不过bounds大小改变时,会保证视图的中心点不变。

25.UIViewController的生命周期方法调用顺序
答:
当一个视图控制器被创建,并在屏幕上显示的时候。 方法的调用顺序
(1) alloc,创建对象,分配空间
(2) init (initWithNibName:bundle:),初始化对象,初始化数据
(3) loadView,加载视图控制器根视图.
(4) viewDidLoad,载入完成,可以进行自定义数据以及动态创建其他控件
(5) viewWillAppear: 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
(6) viewDidAppear: 视图已在屏幕上渲染完成

当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面

(1) viewWillDisappear: 视图将被从屏幕上移除之前执行
(2) viewDidDisappear: 视图已经被从屏幕上移除,用户看不到这个视图了
(3) dealloc,视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
当收到内存警告时
didReceiveMemeoryWarning: 释放临时空闲资源。

26.介绍一下你对面向对象概念的理解?
答:
面向对象:以事物为中心,关心参与事件的所有的事物都具备什么功能,针对于每一个事物单独设计。
面向对象语言三大特性:继承、封装、多态。
类的继承性是指从已有的一个类来extends子类,子类具有了父类的所有特征,同时,子类也可以有新的特性。比如:人是一个类,男人具有了人类的所有的特性,比如思考,比如劳动。同时,男人也有新的特性,比如男人会长胡子。
类的封装是指类把所有的操作都封闭起来,仅仅提供接口出来让其他人使用,使用的人没有必要懂得类里面的操作,只需要懂得操作接口就可以了。比如开汽车,我们只需要懂得方向盘、刹车、油门等等的使用就可以了,没有必要知道刹车是如何构成的封闭好的操作。同时,封装也提高了程序的可替换性。比如两个汽车公司实现刹车的方式不一样,但是,只要我们学会了使用刹车,那么,开两个汽车公司的车就都没有问题了,我们不需要考虑他们怎样实现刹车这门技术的。
类的多态性是一个对象的某项功能可以处理不同类型的问题,或者一个子类可以将父类的某个功能替换成新的功能,具体到编程的方面来说实现类的多态有override和overload,也就是覆写和重载。
同时面向对象还有一个很重要的概念:抽象。抽象就是一个事物的本质。当然对于本质,不同的角度却会有不同的理解。男人,在和女人一起的时候,它的本质是人。在和所有的生物一起的时候,它的本质是动物。

27.重载和覆盖的区别。重载的方法是否可以改变返回值的类型?
答:
重载与覆盖的区别:
1、方法的覆盖是子类和父类之间的关系,当子类不满足父类对方法的实现时,子类可以覆盖重写从父类继承过来的方法,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2、覆盖只能由一个方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求方法必须是同一个;重载要求参数个数不同,返回值类型不同,参数类型不同。

28.UIView的圆角属性设置方法
答:
view1.layer.cornerRadius = 圆角半径;
view1.layer.masksToBounds = YES;

29.请解释以下两种设计模式:工厂模式,单例模式
答:
工厂模式:
工厂模式根据抽象程度的不同分为三种:
①工厂方法:用来快速加工对象。 比如:便利构造器。
②抽象工厂:抽象出一个公共的父类,提高子类公共的功能。子类继承即可,但是不会使用该父类去创建对象使用。
③对象工厂:用来根据需求生成不同类型的对象。 比如:cell工厂。
工厂模式对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
单例模式 :
单例模式的原则就是创建一个单例类,而必须保证该类只能生成一个对象,在该工程中,任何位置访问时,访问的都是该对象。 目的是为了共享内存空间,保证数据的一致性。
设计模式存在的意义在于提高程序的内聚性,降低程序的耦合性。

30.什么是MVC?
答:
系统分为三层:
Model(模型层,数据层):用来封装数据和提供数据,处理数据。
View(视图层):用来显示数据。
Controller(控制层):控制M与V的通讯以及数据传输。
MVC设计思想的意义在于将模块进行分层管理,不让M与V层直接通讯,C扮演了一个中介桥梁的作用,完成M与V的通讯,如果V需要显示数据,询问C,C询问M来提供数据,再通过C将数据传输给V。 如果后期数据出现问题或要更改显示数据,直接替换M即可,V与C无需更改,提高程序的可修改性以及可扩展性。

31.在.m文件Class Extension中声明的私有方法,其他类能否调用?若强行调用会发生什么?
答:
延展中声明的是私有方法,在其他类中无法直接调用。
内存环境区别:
MRC:在其他类中可直接调用,只不过会提示警告。
ARC:在其他类中无法直接调用,编译器报错。

32.在调用支付宝接口支付时,partner,seller,private分别是什么意思?
答:
partner:商户合作者身份ID,签约的支付宝账号对应的支付宝唯一用户号。以2088开头的16位纯数字组成。seller:商户收款账号;private:支付宝私钥;

33.谈谈如何在MVC模式中减轻ViewController的重量(减少代码)
答:
一个完整的模块被分为了三个相对独立的部分,分别是Model,View,Controller.
将数据处理,网络请求,封装数据对象操作全部交由M(数据层)处理。
将视图创建,自定义视图操作,给视图赋值操作交由V(视图层)处理。
而C只做M与V沟通的桥梁即可。

34.为什么很多内置的类,如TableViewController的delegate的属性是assign不v是retain?
答:
如果是retain会引起循环引用。所有的引用计数系统,都存在循环引用的问题。例如下面的引用关系:对象a创建并引用了对象b,对象b创建并引用了对象c,对象c创建并引用了对象b.这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。

35.列举几个你曾经用过的第三方库?
答:
AFN, SDWebImage, FMDB,MBProgressHUD,LORefresh,ZBar,MagicRecord等
36.用宏定义来写出一个判断系统是否是iOS7以上的版本的例子
答:

define IsIOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >=7.0 ? YES : NO)

  1. Objective-C的动态性体现在哪些方面
    答:
    Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有
    动态类型(Dynamic typing) 比如:id,instanceType
    动态绑定(Dynamic binding) 比如:runtime。
    动态加载(Dynamic loading)比如:懒加载。

38.下面的代码会造成什么问题
@implementation xxx… …
- (void) setVar:(int)i {
self.var = i;
}
答:循环调用会出现死循环 。

  1. ios平台怎么做数据的持久化?coredata 和sqlite有无必然联系?coredata是一个关系型数据库吗?
    答:iOS 中可以有四种持久化数据的方式:属性列表(plist)、对象归档、 SQLite3 和 Core Data; core data 可以使你以图形界面的方式快速的定义 app 的数据模型,同时在你的代码中容易获取到它。 coredata 提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在 app 中继续创建新的任务。在使用 core data 的时候,你不用安装额外的数据库系统,因为 core data 使用内置的 sqlite 数据库。 core data 将你 app 的模型层放入到一组定义在内存中的数据对象。 coredata 会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当 core data 在对你 app 数据的改变进行保存的时候, core data 会把这些数据归档,并永久性保存。 mac os x 中sqlite 库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用, sqlite 是一个轻量级的嵌入式 sql 数据库编程。与 core data 框架不同的是, sqlite 是使用程序式的, sql 的主要的 API 来直接操作数据表。 Core Data 不是一个关系型数据库,也不是关系型数据库管理系统 (RDBMS) 。虽然 Core Dta 支持SQLite 作为一种存储类型,但它不能使用任意的 SQLite 数据库。 Core Data 在使用的过程种自己创建这个数据库。 Core Data 支持对一、对多的关系。
    40.多线程中堆与栈分别是共有的还是私有的?(记住)
    答:
    在多线程环境下,每个线程拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。
    其他的资源(比如堆、地址空间、全局变量)是由同一个进程内的多个线程共享。

41.Objective-C 声明一个类所有要用到的编译指令是?
答:
@interface…@end
@implementation…@end

42.用预编译指令#define 声明一个常数,用以表示1年中有多少秒(忽略闰年问题)
答:#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
3). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。

43.解析XML文件有哪几种方式?
答:以 DOM 方式解析 XML 文件;以 SAX 方式解析 XML 文件;

44.下面哪个方法不属于NSObject的内省(Introspection)方法
A.init B. isKindOfClass C. responseToSelector D.isMemberOfClass
答:A, NSObject内省方法是通过分类形式添加的方法,而init方法是该类定义时添加的方法。

45.iOS 开发中,开发证书根据用途划分可以分为哪两大类,分别作用是什么用途?
答:
①development:开发证书,用于真机测试,不能上传项目到AppStore。
②distribution:发布证书,用于发布应用到AppStore。

46.关键字const有什么含义?static的作用?还有extem C的作用?
答:
const是在编译器控制代码的安全性,只在编译期起作用,const修饰的变量不可更改。
static标记的变量叫做静态变量,会存储到全局变量区,生命周期和程序相同。
extern的作用是引用在其他文件中定义的全局变量。

47.让一个物体从界面中的一点运动到另外一点,有哪些方法?
答:
①修改自身视图的中心点。
②修改自身视图的frame。
③修改父视图的bounds。

48.什么是多继承?
答:
Objective C不能像C++,Java一样支持多继承,但是在OC的使用经常会碰到需要使用多继承的情况。例如,ClassA中有methodA,ClassB中methodB,而现在需要使用这两个类中的方法。如何按照C++的编程思路,毫无疑问采用多继承就搞定了,在OC就需要动动脑子了。其实我们在学习设计模式的时候知道,多继承的效率不高,而且采用组合的模式可以完全代替继承模式。
OC实现多继承的方式:协议,分类,子类化,延展。

49.ViewController 的loadView,viewDidLoad,didReceiverMemoryWarning分别是什么时候调用的,在初始化ViewController时在这几个函数中应该做什么工作?
答:
loadView方法:7
当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。 如果手工维护views,必须重载重写该方法 如果使用IB维护views,必须不能重载重写该方法。 该方法会为当前视图控制器加载根视图。
viewDidLoad方法:
该方法是当视图控制器的loadView方法调用结束之后调用,该方法的作用是告诉视图控制器,此时根视图已经加载,在此刻完成子控件的创建和添加即可。
didReceiverMemoryWarning方法:
该方法是当视图控制器收到内存警告时触发,用来回收当前视图控制器的空闲空间以及可重建对象的空间。

50.对于语句 NSString * obj = [[NSData alloc] init];obj在编译时是和运行时分别是什么对象?
答:
声明时是NSString所以编译时是NSString类型
在运行时是NSData类型

51.什么时候用delegate,什么时候用Notification?
答:
delegate针对one-to-one关系,并且reciever可以返回值给 sender,notification 可以针对one-to-one/many/none,reciever无法返回值给sender.所以,delegate用于sender希望接收到 reciever的某个功能反馈值,notification用于通知多个object某个事件。

52.浅赋值和深赋值的区别。
答:
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

53.介绍下KVC和KVO
答:
KVC:是Key-Value- Coding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是直接通过调用Setter、Getter方法访问。是一种间接给实例变量赋值的方式。
KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的方法,极大的简化了代码。这种观察-被观察模型适用于这样的情况,比方说根据A(数 据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的Cocoa而言,KVO应用的地方非常广泛。(这样的机制听起来类 似Notification,但是notification是需要一个发送notification的对象,一般是 notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)
54.多线程实现的三种方式
答:
1. NSThread
2. NSOperationQueue
3. GCD(比较常用,多核CPU的情况下建议使用此方式)

55.谈谈对Block的理解?
答:
block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,经常用于回调以及传值。而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部变量是只读的。

56.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢?为什么?
NSMutableArray * ary = [ [NSMutableArray array] retain];
NSString * str = [NSString stringWithFormat:@“test”];
[str retain];
[ary addObject:str];
NSLog(@“%@%d”,str, [str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@“%@%d”,str,[str retainCount]);
[ary removeAllObject];
NSLog(@“%@,%d”,str,[str retainCount]);

答:
第一个: test 3
这时str的retainCount是
3.

第二个:test 2
第三方:test 1

57.写一个单例(任意语言编写)
答:
+ (Singleton *)mainSingleton {
static Singleton *singleton = nil;
@synchronized(self) {
if (singleton == nil) {
singleton = [[Singleton alloc] init];
}
}
return singleton;
}

  • (Singleton *)mainSingleton {
    static Singleton *singleton = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    singleton = [[Singleton alloc] init];
    });
    return singleton;
    }

58.常见的数据持久化方法有哪些?
答:
1.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。
2.归档,反归档
3.文件读写
4.SQLite
5.CoreData

59.简述tableView的重用机制。
答:
UITableView上面可能要展示很多条数据,如果每一条数据都创建一个cell,空间开销非常大,而且屏幕上只展示有限的cell,所以cell重用能够合理的利用系统空间,达到空间利用的最大化。
UITableView有一个重用队列,该队列的实现形式就是字典套集合, 每一个cell标识一个重用标识符作为字典的key,而cell对象存储到该key对应的集合中。当每次需要cell时,先根据重用标识符从表视图的重用队列中查看是否有可重用的cell,使用dequeueReusableCellWithIdentifier:CellIdentifier: 也就是把重用标识符作为字典的key查看对应的集合中是否有元素。如果有可重用的cell,则直接从集合中取出返回,如果没有,则返回nil。 当一旦没有取到可重用的cell时,就创建一个新的cell对象,并且添加重用标识符,方便下次重用。当表视图拖动,cell滑出屏幕时,超出屏幕的cell会自动放到表视图的重用队列中,也就是放到对应的集合中。

60.实例化一个UITableView对象,要求写出关键语句?
答:
UITableView *tableView = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];
tableView.dataSource = self;
tableView.delegate = self;
[superview addSubview:tableView];
首先需要分配空间设置 表视图的样式
然后需要设置两个必须的委托对象,dataSource提供数据源,delegate处理交互和界面设置。

61.描述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理?
答:
运行时刻是指一个程序在运行(或者在被执行)的状态。也就是说,当你打开一个程序使它在电脑上运行的时候,那个程序就是处于运行时刻。在一些编程语言中,把某些可以重用的程序或者实例打包或者重建成为“运行库”。这些实例可以在它们运行的时候被连接或者被任何程序调用。
如果message send如果寻找不到相应的对象
①该对象为空,则该消息失效。
②该对象不为空,而该类中没有该方法,则程序异常,找不到对应的方法执行
③该对象不为空,而该类中有该方法,调用方法。

62.什么是 method swizzling?(了解)
答:
Method swizzling指的是改变一个已存在的选择器对应的实现的过程,它依赖于Objectvie-C中方法的调用能够在运行时进改变——通过改变类的调度表(dispatch table)中选择器到最终函数间的映射关系。

63.Cocoa Touch 包含什么? 不包含什么?
答:
参考链接:http://blog.csdn.net/iukey/article/details/7666430

64.响应链(Responder chain)是什么?它是如何发挥作用的?
答:
响应者:凡是直接或者间接继承自UIResponder的类创建的对象都是响应者. 比如(UIView,UIViewController,UIApplication).由响应者对象组成的链叫响应者链。
当触摸视图时,系统会有碰撞检测过程,查找该触摸发生到哪个视图上.
UIApplication -> window -> 视图控制器 -> 根视图 -> 视图1 -> 视图2 -> 视图3
碰撞检测结束之后,接下来对触摸事件作出处理,首先查看视图3是否对触摸事件作出处理,如果视图3不处理,则把事件漏给视图2,直到有一个对象处理了.如果都没处理,则事件丢弃.

65.如何获取项目根路径,并在其下创建一个名称为userData的目录
答:
NSString *sandboxPath = NSHomeDirectory();
// 创建文件系统管理器
NSFileManager *manager = [NSFileManager defaultManager];
NSString *filePath = [sandboxPath stringByAppendingPathComponent:@“userData”];
if (![manager fileExistsAtPath:filePath]) {
BOOL isSuccess = [manager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@”%@”, isSuccess ? @”创建成功” : @”创建失败”);
}

66.iPhone5,6,6+以及iPad Air 2的屏幕分辨率分别是多少?
答:
iPhone5:640像素*1136像素;
iPhone6:750像素x1334像素;
iPhone6 Plus 像素1242x2208;
iPad Air 2分辨率是2048×1536分辨率。

67.分辨率的计算单位是什么?
答:
px:pixel,像素,屏幕上显示的最小单位.

68.UIButton的父类是什么?
答:UIControl
69.请解释一下Interface Bulder的作用以及NIB文件的概念
答:
Interface Builder(IB)是Mac OS X平台下用于设计和测试用户界面(GUI)的应用程序。为了生成图形界面,IB并不是必需的,实际上Mac OS X下所有的用户界面元素都可以使用代码直接生成;但IB能够使开发者简单快捷的开发出符合Mac OS X human-interface guidelines的GUI。通常你只需要通过简单的拖拽(drag-n-drop)操作来构建图形界面就可以了。
工程中的可视化文件的后缀是.xib,但是当程序编译之后,存储到包中,XIB文件后缀编程.nib。简称NIB文件。

70.选项卡(Tab Bar)和工具栏(Toolbar)分别是什么?两者之间 有何共同点和不同点
答:
Toolbar:提供一种机制来显示一个工具栏,在屏幕的底部和支持显示和选择的工具栏项目UIBarButtonItem的实例)。
Tab Bar:提供一种机制来显示一个选项卡, 位于屏幕底部的工具栏和支持显示和选择的选项卡栏项(UIBarButtonItem的实例)。

71.数据库中索引的作用?和它的优缺点是什么?
答:
参考链接 http://blog.chinaunix.net/uid-20556037-id-2810995.html

72.UIImageView如何响应点击事件?
答:
userInteractionEnabled交互属性至为YES,再给UIImageView加UITapGestureRecognizer点击手势。

73.如何实现UIScrollView无限滚动?
答:
默认的UIScrollView滑动到底之后(假设往右),就无法继续往右滑了,但为了更好的用户体验,我们继续往右滑是自动回到第一页。这里提供一个方案。
假设有5页,其中分别放着1.jpg 2.jpg 3.jpg 4.jpg 5.jpg五张图,为支持无限滚动,我们把最后一张图复制一份追加到第一张左边,把第一张图复制一份追加到最后一张图右边,即新的UIScrollView有7页,分别是
[1号:5.jpg][2号:1.jpg][3号:2.jpg][4号:3.jpg][5号:4.jpg][6号:5.jpg][7号:1.jpg]
然后把初始的位置移动到2号。接下来,如果用户滑动到7号位置,则立刻把位置更换到2号,此时用户并没有发现位置发生了改变,从而实现了无限往右滚。同理,如果用户滑动到1号位置,则立刻把位置更换到6号,实现无限往左滚。至此,实现了无限滚动。

74.多线程中,访问同一变量,如何加锁?
答:方法一,
@synchronized(id anObject),(最简单的方法)
@synchronized(self) {
// 这段代码对其他 @synchronized(self) 都是互斥的
// self 指向同一个对象
}
方法二,NSLock
NSLock对象实现了NSLocking protocol,包含几个方法:
lock,加锁
unlock,解锁
tryLock,尝试加锁,如果失败了,并不会阻塞线程,只是立即返回NO
lockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO
方法三,NSRecursiveLock,递归锁
NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。
方法四,NSConditionLock,条件锁
NSConditionLock,条件锁,可以设置条件
方法五,NSDistributedLock,分布锁
NSDistributedLock,分布锁,文件方式实现,可以跨进程
用tryLock方法获取锁。
用unlock方法释放锁。
如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。

75.写一个委托的(协议) interface
答:
@protocol MarryDelegate
@required
- (void)earnMoney;
- (void)makeFood:(NSString *)foodName;
@end
76.UITableview的执行流程是怎么样的?
答:
1、numberOfSectionsInTableView:
2、heightForHeaderInSection ,section次数
3、heightForFooterInSection ,section次数
4、numberOfRowsInSection ,行数
5、heightForRowAtIndexPath,行高,
6、cellForRowAtIndexPath :
7、willDisplayCell

77.简述XMPP中有哪些节点,各个节点分别有什么作用?
答:
常用的节点有IQ, Message, Presence;
IQ: Info/Query(信息与查询), 它为XMPP通信提供请求与响应机制。
Message: 消息节点, 一种基本推送消息方法,它不要求响应。
Presence:用来表明用户的状态,如:online、away、dnd(请勿打扰)等。

78.使用AVPlayer播放视频时,视频监听的AVPlayerItem状态有几种,分别是什么及作用?
答:
AVPlayerStatusUnknown,代表视频未知的
AVPlayerStatusReadyToPlay:代表视频已经可以播放了
AVPlayerStatusFailed,代表视频播放错误的

79.简述使用CLLocationManager定位时,如何停止定位?
答:stopUpdatingLocation

80.iOS中有几种消息机制,区别以及各种机制的使用场景 (很全面哦)
答:参考链接:http://www.cocoachina.com/industry/20131216/7543.html

81.UI布局的几种方式,各种方式的利弊谈谈您的看法
答:
a.纯代码, 通过代码手动更改, 比较麻烦, 但是代码相对集中
b.可视化编程, 通过IB工具, 使用autolayout+sizeclasses技术做布局, 适配多种屏幕, 但是控件过多是约束会比较多, 难以维护.
82.你用过NSOperationQueue吗?请描述它和GCD的区别和类似的地方
答:
使用NSOperationQueue用来管理子类化的NSOperation对象,控制其线程并发数目。GCD和NSOperation都可以实现对线程的管理,区别是 NSOperation和NSOperationQueue是多线程的面向对象抽象。项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

83.HTTP和Socket的区别?
答:
Socket连接和HTTP连接的区别
HTTP协议:超文本传输协议,是基于请求和响应模式的应用层协议 。
Socket:不是协议,是套接字,由IP和端口两部分标识,是封装在传输层之上的。
HTTP连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;
Socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。

84.Core Foundation中提供了哪几种操作Socket的方法?
答: CFNetwork 、 CFSocket 和 BSD Socket 。

85.请描述Xcode打包签名机制中Certificates & Identifiers & Provisioning Profiles三者的关系?
答:
Certificates:证书,分为开发证书和发布证书,是一个开发者账号身份的标识,也是是否账号是否可用的标识。
Identifiers:应用程序唯一标识识。如果是发布的项目,标识必须唯一,对项目起到唯一标识的作用。而测试的标识可以是通配的。
Provisioning Profiles:描述文件是对证书和项目标识的描述文档。

86.iCloud包含了哪些技术与服务?
答:
iCloud是苹果公司所提供的云端服务,使用 者可以免费储存5GB的资料。 可以备份存放照片、音乐、通讯录、短信、文档等内容,在你需要的时候以无线方式将他们推送到你所有的设备上。自行执行。轻松自如、运作流畅,它就是这么管 用。可与亲朋好友共享体验的完整平台。它不仅安全,而且可提供丰富的社交体验,从任何计算机或设备均可随时方便地进行访问。iCloud上所提供的应用程 序包括办公生产率、开发工具、媒体和窗口小部件等。随着时间的推移,还将通过易于使用的市场空间和应用程序开发工具箱提供范围更广的应用程序。

87.UITableView需要实现那些代理?请列出UITableVIew代理中必须实现的与其他一些常用函数?
答:
必须实现:
- ( NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section;
一组有多少行
- ( UITableViewCell )tableView:( UITableView )tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath;
常用(当然也可以多罗列一些):
- ( void )tableView:( UITableView )tableView didSelectRowAtIndexPath:( NSIndexPath )indexPath
选中以后事件设置
- ( CGFloat )tableView:( UITableView )tableView heightForRowAtIndexPath:( NSIndexPath )indexPath

88.Objective-c有私有方法没,有私有变量吗?
答:
只在.m文件实现,未在.h文件声明的方法叫做类的私有方法,只能在本类中访问。但是OC中没有绝对的私有,一旦知道了方法的名字,就可调用,前提是MRC环境。有私有变量。

89.UITableView 重新加载数据有几种方式?那种更好?如何对UITableView优化?
答:
三种方式加载数据:
①reloadData
②reloadRowsAtIndexPaths:withRowAnimation:
③reloadSections:withRowAnimation:
如果要全部刷新,①更好一些。
如果只想刷新某些行,则②更好一些。
如果要刷新某个分区内的数据,则③更好一些。
根据需求场景选择对应的刷新方式。
UITableView优化:
①使用不透明视图。
②不要重复创建不必要的table cell。
③减少视图的数目。
④不要做多余的绘制工作。
⑤预渲染图像。
⑥不要阻塞主线程。

90.App crash后,有哪些调试方法?
答:
①断点单步调试
②全局断点确定崩溃位置
③僵尸调试查看崩溃日志原因
④暴力调试

91.谈谈你对NSRunLoop的理解;
答:
NSRunLoop是消息机制的处理模式。NSRunLoop的作用在于有事情做的时候使的当前NSRunLoop的线程工作,没有事情做让当前NSRunLoop的线程休眠。NSTimer默认添加到当前NSRunLoop中,也可以手动制定添加到自己新建的NSRunLoop
NSRunLoop就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。
在单线程的app中,不需要注意Run Loop,但不代表没有。程序启动时,系统已经在主线程中加入了Run Loop。它保证了我们的主线程在运行起来后,就处于一种“等待”的状态(而不像一些命令行程序一样运行一次就结束了),这个时候如果有接收到的事件(Timer的定时到了或是其他线程的消息),就会执行任务,否则就处于休眠状态。

92.自动布局(Auto layout)的作用是什么? 请概括一下它是如何运行的;
答:
AutoLayout为开发者提供了一种不同于传统对于UI元素位置指定的布局方法。以前,不论是在IB里拖放,还是在代码中写,每个UIView都会有自己的frame属性,来定义其在当前视图中的位置和尺寸。使用AutoLayout的话,就变为了使用约束条件来定义view的位置和尺寸。这样的最大好处是一举解决了不同分辨率和屏幕尺寸下view的适配问题。
sizeclass的作用:ios8中为了解决屏幕适配,引入了一个全新的概念,sizeclass 而这个使用的时候不需要判断屏幕的尺寸,也没有横屏和竖屏的概念,只有(Compact、Any,Regular)的概念!在Xcode新建的项目中,看到的storyboard界面下面栏目中,有一个(wAny,hAny)点击之后会出现一个可选择的类似九宫格的表格,这个就是一个屏幕选择器,可以对不同屏幕进行选择!

93.UILabel是否可以显示html文本,如果可以怎么显示?
答:可以
NSString * htmlString = @” Some html string \n This is some text! “;
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; UILabel * myLabel = [[UILabel alloc] initWithFrame:self.view.bounds];
myLabel.attributedText = attrStr;
[self.view addSubview:myLabel];

94.如果现在需要让UILabel进行交互,(可以点击响应事件),有哪些方式?
答:
①.userInteractionEnabled 属性设置为YES;
②.添加手势识别器
UITapGestureRecognizer *tapGestureTel = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(teleButtonEvent:)]autorelease];
[telephoneLabel addGestureRecognizer:tapGestureTel];

95.数据库中有三张表
分别为:
Goods(商品表):ID商品编号、NAME商品名称、MANEFACTURER生产商 SID规格编号
Spec(规格表):ID规格编号、COLOR颜色、SIZE尺寸
Sales_record(销售记录表):ID 销售记录流水号、GID销售商品编号、COUNT销售量
(1)请设计查询语句查出规格号为1销售量最多的商品编号、商品名称、颜色、尺寸;
答:
select TOP 1 GID from Sales_record where GID in (select ID from Goods where SID = ‘1’) order by count desc。
select ID,NAME,COLOR,SIZE from Goods,Spec where Goods.SID = GID and Spec.ID = GID.
(2)请设计查询语句查询生产商在上海(以上海开头)的商品的销售总和。
答:select sum(count) from Sales_record where GID in (select ID from Goods where 生产商 like “上海”% )

96.举例说明如何在多台机器上共享开发证书
答:
由一个人在开发者账号管理中心创建一个证书,创建时和本地的CSR文件进行签名,创建好之后,从钥匙串中找到创建的证书,导出p12文件,发给他人。

97.举例说明,当需要将一个从未配置的过签名的APP发布到APPStore上时,配置签名过程。
答:参考应用程序发布流程。

98.如何设计一个可变高度(根据内容适应高度)的UITableViewCell?
答:参考课程cell自定义高度。

99.一瓶啤酒一块钱,两瓶空瓶子可以换一瓶啤酒,现在你有20块钱,问你总共能喝多少瓶啤酒?
答:39

  1. UIView与CLayer有什么区别?
    答:
    1).UIView 是 iOS 系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由 CoreAnimation 来实现的。它真正的绘图部分,是由一个 CALayer 类来管理。 UIView 本身更像是一个 CALayer 的管理器,访问它的跟绘图和跟坐标有关的属性。
    2).UIView 有个重要属性 layer ,可以返回它的主 CALayer 实例。
    3).UIView 的 CALayer 类似 UIView 的子 View 树形结构,也可以向它的 layer 上添加子layer ,来完成某些特殊的表示。即 CALayer 层是可以嵌套的。
    4).UIView 的 layer 树形在系统内部,被维护着三份 copy 。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。
    5).动画的运作:对 UIView 的 subLayer (非主 Layer )属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是 0.5 秒。
    6).坐标系统: CALayer 的坐标系统比 UIView 多了一个 anchorPoint 属性,使用CGPoint 结构表示,值域是 0~1 ,是个比例值。这个点是各种图形变换的坐标原点,同时会更改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} ,即在 layer 的中央。
    7).渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay 方法来重绘显示。
    8).变换:要在一个层中添加一个 3D 或仿射变换,可以分别设置层的 transform 或affineTransform 属性。
    9).变形: Quartz Core 的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。 CATransform3D 的一套方法提供了一些魔术般的变换效果。

  2. What is push notification? (什么是推送通知)
    答:
    a. 本地推送:程序内部弹出通知到用户设备
    b.远程推送:由推送服务器推送通知到用户设备. 过程为
    1、首先是应用程序注册消息推送。
    2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
    3、应用程序将deviceToken发送给PUSH服务端程序。
    4、 服务端程序向APNS服务发送消息。
    5、APNS服务将消息发送给iPhone应用程序。

102.What is Polymorphism?
翻译:什么是多态。

103.What is Singleton?
翻译:什么是单例。

104.What is responder chain?
翻译:什么是响应者链。

105.Difference between frame and bounds?
答:
frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
bounds的大小改变frame也会改变。只不过bounds大小改变时,会保证视图的中心点不变。

106.Difference between method and selector?
答:
method:包含整个方法的定义:返回值类型,方法名,参数,参数类型,方法体。而selector是通过方法名找到方法地址,从而判断该方法是否存在。

107.Is there any garbage collection mechanism in Objective-C?
答:
1> OC 1.0没有垃圾回收
2> OC 2.0有垃圾回收,只能用在Mac上
3> iOS中有ARC机制,是编译器特性,垃圾回收是运行时特性

108.What is NSOperation queue?
答:
NSOpertaionQueue操作队列,用来管理多个操作任务,为每一个任务安排对应的子线程。可实现线程同步和线程并发。

109.What is lazy loading?
答:
延迟加载(懒加载):当需要用到该对象的时候,再去创建对象,合理利用空间。
比如:控制器的view,在第一次用到view时才会调用loadView方法进行创建。

110.Can we use two tableview controllers on one viewcontroller?
答:
从技术角度上分析,一个控制器内部添加2个表格控制器是没有问题的.通过addChildViewController:简历一个视图控制器和两个tableView controller的父子关系。

111.What is block? Please write a simple example to block;

block是一个代码块,比如一些其它Web编程语言中的“匿名函数”。在objc中通常使用block实现代理方法实现的功能,也就是回调。使用代理需要设置代理的数据接收者,而且代理方法是被分离开来处理的,block可以将这些分离的代码放到一个代码块中。
.h
typedef void(^MyBlock)(int value);
@property (nonatomic,weak) MyBlock block;
- (void)setMyBlock:(void(^)(int value)) block;

.m
- (void)setMyBlock:(void(^)(int value)) block {
if (block) {
self.block=block;
}
}

你可能感兴趣的:(面试题)