iOS面试题300+

*面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家  收到差不多3个offer,总结起来就是把基础的东西弄好,复杂的东西了解就ok了!

*此题库是2015-2106年北上广深杭各大小公司面试题。

*注:如今社会还是得靠本事,面试题60分只是多了一个机会,珍惜机会的同时提高自己硬实力才是真理!

1.给定一个字符串,输出本字符串中只出现一次并且最靠前的那个字符的位置?比如“abaccddeeef”则是b,输出2

答: int main()

{

char a[80] = "abaccddeeef\0";

char ch;

int i, m, b[80];

int flag = 0;

ch = getchar();//获取一个字符

m = strlen(a);

for (i = 0; i < m; ++i){

if (a[i] == ch){//找到了,直接判断是否相等

b[flag] = i+1;//记录位置

flag += 1;

}

}

if (flag == 0)printf ("no");

else {

printf ("%d\n", flag);

for (i = 0; i < flag; i++){//对位置进行输出,用循环

printf ("%d ", b[i]);

}

printf ("\n");

}

return 0;

}

2.实现一个冒泡排序或者快速排序

答:冒泡排序:

intarray[5] = { 28,27,36,45,8};

for (int i = 0; i < 4; i++) {

for(int j = 0; j < 4; j++) {

if (array[j] > array [j + 1]){

int temp = array[j];

array[j] = array[j + 1];

array[j + 1] = temp;

}}}

for(int i = 0; i < 5; i++) {

printf("%d\n",array[i]);}

3.请编写一个函数用于计算阶乘

答: int f(int i)

{intt=1,j;

for(j=1;j<=i;j++)

t=t*j;

return t;

}

4.Cocoa Touch提供了几种Core

Animation过渡类?

答:Cocoa Touch提供了4种Core

Animation过渡类型,分别为:交叉淡化、推挤、显示和覆盖。

5.iOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据吗?

答:数据的持久化本质上都是就是写文件,但从逻辑上又分成很多种,比如写入沙盒,比如存到网络上,比如写入数据库。

core data是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要obj-c的api,所以有了core data ,另外,core data不仅仅是把c的api翻译成oc的api,还提供了一些管理的功能,使用更加方便。

App升级之后数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,手动写sql语句操作还是麻烦一些。

CoreData不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑CoreData。

CoreData并不是直接操纵数据库,比如:使用CoreData时不能设置数据库的主键,目前仍需要手动操作。

6.Object-c的类可以多重继承么?可以实现多个接口么?category是什么?重写一个类的方式用继承好还是分类好?为什么?

答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

7.#import跟#include有什么区别,@class呢?#import<>跟#import””有什么区别?

答: #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。

8.属性readwrite,readonly,assin,retain,copy,nonatomic各是什么作用,在哪种情况下用?

答: readwrite是可读可写特性;需要生成getter方法和setter方法时

readonly是只读特性只会生成getter方法不会生成setter方法;不希望属性在类外改变

assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;

copy表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。

nonatomic非原子操作,决定编译器生成的setter

getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic

9.写一个setter方法用于完成@property(nonatomic,

retain)NSString *name;写一个setter方法用于完成@property(nonatomic, copy)NSString *name;

答: -(void)setName:(NSString *) str

{

[str retain];

[name release];

name = str;

}

- (void)setName:(NSString *)str

{

id t = [str copy];

[name release];

name = t;  }

10.对于语句NSString *obj =

[[NSData alloc] init]; obj在编译时和运行时分别是什么类型的对象?

答:编译时是NSString的类型;运行时是NSData类型的对象

11.当前已经编程实现函数:int

rand100().该函数可返回0~99的随机整数,且可以保证等概率.请利用该函数实现int rand10000(),要求等概率返回0~9999的随机数.(不可使用其他的系统函数)

12.汤姆现在要在家里举行宴会,他虽然有很多筷子,但这些筷子的长度并不完全相同,先已知每根筷子的长度,要求每位客人都能拿到两根长度相同的筷子

,求最多可邀请的客人数.

编程实现:int getMax(int arrLength[N])

13.现有一个整数序列,你可以交换其中的任意两个数以得到一个新序列.求共能得到多少种可能结果.(注意:3,3,3,3无论怎么交换,只能得到一个序列)

编程实现:int getTotal(int arrOrigin[N])

14.现有一个M行N列的数组,要求安装反向斜对角线(右上->左下)的方式,打印该数组.编程实现:intprintMatrix[int arrMatrix[M][N]]

下面样例的打印顺序为:

0->1->4->2->5->8->3->6->9->7->10->11

123

4567

8910 11

15.在UIKit中,frame与bounds的关系是( C )

A. frame是bounds的别名

B. frame是bounds的继承类

C. frame的参考系是父规图坐标, bounds的参考系是自身的坐标

D.frame的参考系是自身坐标,bounds的参考系是父规图的坐标

16.一个类的delegate(代理)的作用不正确的是( D )

A.delegate中的函数在其他类中实现

B.主要用于不同类型的对象之间一对一传递消息

C.没有指派则不会触发

D.可以一个对象的delegate指派给多个其他类型的对象

17.下面关于Objective-C内存管理的描述错误的是(A )

A.当使用ARC来管理内存时,对象的retain,dealloc方法不会被调用

B.autoreleasepool在drain的时候会释放在其中分配的对象

C.当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露

D.在使用ARC的项目中不能使用NSZone

18.下面block定义正确的是( A )

A.tyoedef void(^SuccessBlock)(BOOLsuccess);

B. tyoedef void(^SuccessBlock)(NSStringvalue,BOOL success);

C. tyoedef void^(SuccessBlock)(NSStringvalue,BOOL success);

D. tyoedef void^(SuccessBlock)(NSString*value);

19.UIButton从子类到父类一次继承自:( D )

A. UIView-> UIViewController->UIController

B. UIResponder-> UIControl-> UIView

C. UIControl-> UIResponder->UIViewController

D. UIControl-> UIView-> UIResponder

20.下列关于iOS开发中类方法的使用描述,错误的是:( C )

A.类方法可以调用类方法

B.类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法

C.类方法不可以使用实例变量,包括self(可以使用self)

D.类方法作为消息,可以被发送到类或者对象里面去

31.什么情况下使用关键字weak和assign有何不同?

答:assign指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针!

32.Object-C的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类方法的方法用继承好还是分类好?为什么?

答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

32.如何用iOS设备进行性能测试?

答: Profile-> Instruments ->Time Profiler

33.我们说的oc是动态运行时语音是什么意思?

答案:多态。主要是将数据类型的确定由编译时,推迟到了运行时。这个问题其实浅涉及到两个概念,运行时和多态。简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。因此也可以说,运行时机制是多态的基础。

34.你的项目什么时候选择使用GCD,什么时候选择NSOperation?

答:项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

35.读文件是输入流还是输出流?

东西读入内存就是输入流东西从内存写到记录存储输出流而我们本身就以记录存储为原点所有会有不解的感觉~java io流按照java io流的方向可以分为输入流和输出流输入流是将资源数据读入到缓冲Buffer中,输出流是将缓冲Buffer中的数据按照指定格式写出到一个指定的位置,所以这两个流一般同时使用,才有意义。例如你要做文件的上传,你要先用输入流将待上传文件读入缓冲,然后用输出流将文件写出到网络服务器的一个位置,则上传成功;若是文件下载,则先获得输入流,来读取网络服务器中的一个文件,然后用输出流写到本地的一个文件中;还有例如文件的拷贝,也是先用输入流读再用输出流写出去的很好的例子,你可以先做一个小例子试试,对你理解java io有帮助

36.简述CALayer和UIView的关系

答:UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。

结论:

UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。

37.声明一个静态方法和一个实例方法

答:先说实例方法,当你给一个类写一个方法,如果该方法需要访问某个实例的成员变量时,那么就将该方法定义成实例方法。一类的实例通常有一些成员变量,其中含有该实例的状态信息。而该方法需要改变这些状态。那么该方法需要声明成实例方法。

静态方法正好相反,它不需要访问某个实例的成员变量,它不需要去改变某个实例的状态。我们把该方法定义成静态方法。

38.常见的Object-C的数据类型有哪些?和Cd基本数据类型有什么区别?

答: object-c的数据类型有nsstring,nsnumber,nsarray,nsmutablearray,nsdata等等,这些都是class,创建后便是对象,而c语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;而object-c的nsnumber包含有父nsobject的方法和nsnumber自己的方法,可以完成复杂的操作。

39.UIView的动画效果有哪些

如UIViewAnimationOptionCurveEaseInOut

UIViewAnimationOptionCurveEaseIn

UIViewAnimationOptionCurveEaseOut

UIViewAnimationOptionTransitionFlipFromLeft

UIViewAnimationOptionTransitionFlipFromRight

UIViewAnimationOptionTransitionCurlUp

UIViewAnimationOptionTransitionCurlDown

40.你了解svn,cvs等版本控制工具么?

答:了解.

41.静态链接库(了解一下)

答:静态库是程序代码的集合,是共享代码的一种方式

静态库是闭源的存在形式.a和.framework

连接时,静态库会被完全的复制到可执行文件中,被多次使用就会有冗余拷贝,相当于java里的jar包,把一些类编译到一个包中,在不同的工程中如果导入此文件就可以使用里面的类,

42.什么是沙箱模型?哪些操作是属于私有api范畴?

答:1、应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒。

2、应用程序间不能共享数据,沙盒里的文件不能被复制到其他应用程序文件夹中,也不能把其他应用程序文件夹中的文件复制到沙盒里。

3、苹果禁止任何读、写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中。

4、沙盒根目录里有三个文件夹:Documents,一般应该把应用程序的数据文件存到这个文件夹里,用于存储用户数据或其他应该定期备份的信息。Library,下有两个文件夹,Caches存储应用程序再次启动所需的信息,Preferences包含应用程序偏好设置文件,不过不要在这里修改偏好设置。temp,存放临时文件,即应用程序再次启动不需要的文件。

沙盒根目录里有三个文件夹分别是:documents,tmp,Library。

1、Documents目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。

2、AppName.app目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

3、Library目录:这个目录下有两个子目录:Caches和Preferences

Preferences目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.

Caches目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。

4、tmp目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。

iOS沙盒(sandbox)中的几个目录获取方式:

//获取沙盒主目录路径

NSString *homeDir = NSHomeDirectory();

//获取Documents目录路径

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

NSString *docDir = [paths objectAtIndex:0];

//获取Caches目录路径

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

NSString *cachesDir = [paths objectAtIndex:0];

//获取tmp目录路径

NSString *tmpDir =  NSTemporaryDirectory();

//获取当前程序包中一个图片资源(apple.png)路径

NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];

UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

例子:

NSFileManager* fm=[NSFileManagerdefaultManager];

if(![fm fileExistsAtPath:[selfdataFilePath]]){

//下面是对该文件进行制定路径的保存

[fm createDirectoryAtPath:[selfdataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];

//取得一个目录下得所有文件名

NSArray *files = [fm subpathsAtPath: [selfdataFilePath] ];

//读取某个文件

NSData *data = [fm contentsAtPath:[selfdataFilePath]];

//或者

NSData *data = [NSDatadataWithContentOfPath:[self dataFilePath]];

}

43.协议是什么?有什么作用?

协议:声明一系列的方法,可由任何类实施,即使遵守该协议的类没有共同的超类。协议方法定义了独立于任何特定类的行为。简单的说,协议就是定义了一个接口,其他类负责来实现这些接口。如果你的类实现了一个协议的方法时,则说该类遵循此协议。

协议的作用:

1.定义一套公用的接口(Public)

@required:必须实现的方法

@optional:可选实现的方法(可以全部都不实现)

2.委托代理(Delegate)传值:

它本身是一个设计模式,它的意思是委托别人去做某事。

比如:两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。

又比如:控制器(Controller)与控制器(Controller)之间的传值,从C1跳转到C2,再从C2返回到C1时需要通知C1更新UI或者是做其它的事情,这时候我们就用到了代理(Delegate)传值。

44.你在开发大型项目时,如何进行内存泄露检测的?

可以通过xcode的自带工具run---start with performance tool里有instruments下有个leaks工具,

启动此工具后,运行项目,工具里可以显示内存泄露的情况,双击可找到源码位置,可以帮助进行内存泄露的处理。

45.你实现过一个框架或者库以供别人使用么?如果有,请谈一谈构建框架或者库是的经验;如果没有,请设想和设计框架的public的API,并指出大概需要如何做,需要注意一些什么方面,来方便别人容易地使用你的框架.

46.app从创建应用到上架过程(appstore)

在你开始将程序提交到App Store之前,你需要有一个App ID,一个有效的发布证书,以及一个有效的Provisioning profile。

在itunesconnect网站上,创建app应用,设置对应信息,上传app打包文件,提交等待审核

47.用你熟悉的语音,编程实现Fibonacci数列:int F(intn);

Fibonacci数列递推式F(n) = F(n-1) +F(n-2)

F(1) = 1

F(2) = 2

F(3) = 3

F(4) = 5

F(5) = 8

int F(int n){

if(n == 1){

return1;

}

return f(n-1)+f(n-2);

}

48.给定两个排好序的数组A,B,请写一个函数,从中找出他们的公共元素:findCommon(A,

B)并列举其他可能的查找方法,越多越好

例如:

Array A = [1, 3, 5, 6, 9]

Array B = [2, 3, 6, 8, 10]

返回结果= [3, 6]

void FindCommon(int* a, int* b, int n)

{

int i = 0;

int j = 0 ;

while(i < n && j < n){

if (a[i] < b[j])

++i ;

else if(a[i] == b[j])

{

cout << a[i] << endl ;

++i ;

++j ;

}

else// a[i] > b[j]

++j ;

}

51.KVO的实现原理?

答:KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制。

52.如何给一个对象的私有属性赋值?

答:利用KVC即键值编码来给对象的私有属性赋值.

53.block的本质是什么?为啥在block里面更改外面变量的值,要给外面的变量加_block修饰,加_block修饰的原理是什么?

答: (1) block本质是一个数据类型,多用于参数传递,代替代理方法, (有多个参数需要传递或者多个代理方法需要实现还是推荐使用代理方法),少用于当做返回值传递. block是一个OC对象,它的功能是保存代码片段,预先准备好代码,并在需要的时候执行.

(2)因为使用block代码块可能会引起内部循坏引用,所以应在block定义前加上修饰

54.block在哪种情况下会造成循环引用,如何解决?

答:(1)从两方面分析造成循环引用问题

当self拥有一个block的时候,在block又调用self的方法(或者self所拥有的某个属性)。形成你中有我,我中有你,这种时候会造成循环引用

把某个实例变量变成本地临时变量,强引用将直接指向这个本地临时变量,但本地临时变量一般都会很快释放,所以一般考虑第一种情况

(2)解决方案:对block进行修饰__weak(arc)或__block(mrc)

55.NSURLSession在什么情况下回存在循环引用的问题,怎么解决?

答: (1)在使用NSURLSession签订其代理的时候会存在循环引用问题,因为其代理是retain强引用

(2)解决方案

(1)在下载完成后取消NSURLSession会话并释放Session,赋值为nil。

(2)再视图将要消失时也执行同样的操作。为了防止没有下载完成就跳转控制器。

具体如下:

/**视图将要消失的时候,取消session*/

- (void)viewWillDisappear:(BOOL)animated

{

[superviewWillDisappear:animated];

//任务完成,取消NSURLSession

[self.sessioninvalidateAndCancel];

//释放会话

self.session =nil;

}

56.如何自己实现GET缓存?

答:1.使用GET请求数据

2.iOS系统SDK已经做好了缓存。需要的仅仅是设置下内存缓存大小、磁盘缓存大小、以及缓存路径,代码如下

NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];

[NSURLCache setSharedURLCache:urlCache];

57.在使用SQLite过程中,如果多条线程同时操作同一数据库会造成什么问题,怎么解决?

答:(1)容易造成系统崩溃

(2)解决方案:开启第3种串行模式,使用一个类(单例方式)操作数据库

58.如果提交一个Json格式的数据给后台服务器,后台服务器返回的是一段普通文字,用NSURLConnection/NSURLSession/AFN分别如何实现?

答:1.使用NSURLConnection发送请求的步骤很简单

(1)创建一个NSURL对象,设置请求路径(设置请求路径)

(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)

(3)使用NSURLConnection发送NSURLRequest(发送请求)

2.使用NSURLSession发送请求的步骤很简单

1)确定请求路径(一般由公司的后台开发人员以接口文档的方式提供),GET请求参数直接跟在URL后面

2)创建请求对象(默认包含了请求头和请求方法【GET】),此步骤可以省略

3)创建会话对象(NSURLSession)

4)根据会话对象创建请求任务(NSURLSessionDataTask)

5)执行Task

6)当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)

59.请描述一下SDWebImage内部实现的原理

答:SDWebImage底层实现有沙盒缓存机制,主要由三块组成

1、内存图片缓存

2、内存操作缓存

3、磁盘沙盒缓存

60.你对runtime都有哪些了解,你在实现开发过程中,或是你在所使用的第三方框架中,有没有使用过runtime的,如果有,请你描述一下其内部实现机制

答:Runtime:runtime是一套比较底层的纯C语言API,属于1个C语言库,包含了很多底层的C语言API。在我们平时编写的OC代码中,程序运行过程时,其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者.

(http://www.w2bc.com/article/126999网址中搜索:其实最终都是转成了runtime的C语言代码)

61.线程间怎么通信?

(1)GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//下载图片

UIImage *image = nil;

dispatch_async(dispatch_get_main_queue(),^{

//回到主线程

});

(2)NSThread的线程通信

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//下载图片

UIImage *image = nil;

[selfperformSelector:@selector(settingImage:) onThread:[NSThread mainThread]withObject:image waitUntilDone:YES modes:nil];

}

这种情况也适用于子线程之间的通信。

62.网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题?

答案:利用字典图片地址为key,下载操作为value

63.自动释放池底层怎么实现?

答:自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶.当一个对象收到发送autorelease消息时,他被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,他们从栈中被删除,并且会给池子里面所有的对象都会做一次release操作

64.不用中间变量,用两种方法交换A和B的值

A = A+B;

B = A - B;

A = A - B;

65.简单描述一下客户端的缓存机制?

答案:无法简述,详细了解下,明白了够装逼就好http://www.cnblogs.com/wendingding/p/3950198.html

66.控制器View的生命周期及相关函数是什么?你在开发中是如何用的?

>1.在视图显示之前调用viewWillAppear;该函数可以调用多次;

>2.视图显示完毕,调用viewDidAppear;

>3.在视图消失之前调用viewWillDisAppear;该函数可以调用多次(如需要);

>4.在布局变化前后,调用viewWill/DidLayoutSubviews处理相关信息;

67.NSRunLoop的实现机制,及在多线程中如何使用?

答案:NSRunLoop是iOS的消息机制的处理模式

>1NSRunloop的主要作用:控制runloop里面线程的执行和休眠,在有事情做的时候使挡墙NSRunloop控制的线程工作,没有事情做让当前runloop的控制线程休眠.

>2.runloop就是一直在循环检测,从线程start到线程end,检测inputsourse(如点击,双击等操作)异步时间,检测timesourse同步事件,见到检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。

>3.runloopmode是一个集合,包括监听:事件源,定时器,以及需通知的runloop observers

>1.只有在为你的程序创建次线程的时候,才需要运行run loop。对于程序的主线程而言,run loop是关键部分。Cocoa提供了运行主线程run loop的代码同时也会自动运行run loop。IOS程序UIApplication中的run方法在程序正常启动的时候就会启动run loop。如果你使用xcode提供的模板创建的程序,那你永远不需要自己去启动run loop

>2.在多线程中,你需要判断是否需要run loop。如果需要run loop,那么你要负责配置run loop并启动。你不需要在任何情况下都去启动run loop。比如,你使用线程去处理一个预先定义好的耗时极长的任务时,你就可以毋需启动run loop。Run loop只在你要和线程有交互时才需要

68.简单说一下APP的启动过程,从main文件开始说起

进入main函数,在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点!

int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)

argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可

principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值

delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议

此函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

lUIApplication对象会依次给delegate对象发送不同的消息,接着会建立应用程序的main runloop(事件循环),进行事件的处理(首先会调用delegate对象的application:didFinishLaunchingWithOptions:)

程序正常退出时这个函数才返回。如果进程要被系统强制杀死,一般这个函数还没来得及返回进程就终止了

69.第三方API你是怎么用的?

cocoa pod导入

70.用预处理指令#define声明一个常数,用以表明一年中有多少秒?(忽略闰年问题)

答:#define second 365*24*60*60

91.UITableView需要实现哪些代理?列出UITableView代理中必须实现的与其他一些常用的函数.

答:

-( NSInteger )tableView:( UITableView *)tableViewnumberOfRowsInSection:( NSInteger)section;

一组有多少行

-( UITableViewCell *)tableView:( UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;

每行中的cell的实现以上两个方法为必须要实现的

常用的有

- ( void )tableView:( UITableView *)tableViewdidSelectRowAtIndexPath:( NSIndexPath*)indexPath

选中以后事件设置

-( CGFloat )tableView:( UITableView *)tableViewheightForRowAtIndexPath:( NSIndexPath*)indexPath

设置cell的高度

等等。。。。。

92.在iOS上开发一个应用程序时怎么做的?

答:首先,要有一个MAC系统(买一台苹果电脑,苹果本或者MACmini),没有这个条件可以装一个黑苹果的mac系统或者装一个虚拟机。然后装一个X-CODE开发环境。要是学习ios开发的话,这些就可以了。如果要开发、上线的话,就得准备iphone/ipod、ipad做为测试机,到苹果申请一个开发者账号,每年的年费99美元。再然后接着就可以开发你的程序了,开发完毕之后,发布到App store上面,通过审核就可以了。

*93.C++和Objective-C的混合使用,以下描述错误的是()

//未找到答案或是C++JAVA

A. cpp文件只能使用C/C++代码

B. cpp文件include的头文件中,可以出现objective-C的代码

C. mm文件中混用cpp直接使用即可

D. cpp使用objective-C的关键是使用接口,而不能直接使用代码

*94.以下哪一段代码不会抛出异常( C& D )

A. NSArray *array = @[1, 2, 3];NSNumber*number = array[3];// @[@1,@ 2,@ 3]

B. NSDictionary *dict = @{@”key”:

nil};//value不能为空

C. NSString *str = nil; NSString *str2 =[str substringFromIndex:3];

D. NSString *str = @”hi”;NSString *str2 =[str substringFromIndex:3];

*95.在没有navigationController的情况下,要从一个ViewController切换到另一个ViewController应该()

A.{self.navigationControllerpushViewController:nextViewController animated:YES};

B.{self .viewaddSubview:nextViewController}

C. {selfpresentModalViewController:nextViewController animated:YES};

D. {selfpushViewController:nextViewController animated:YES};

分析:A、C都需要有navigationController,B一个控制器的view是无法加载另一个控制器的view的,所以选C!

*96.关于下面线程管理错误的是()

//不确定

A.GCD在后端管理着一个线程池

B.NSOperationQueue是对NSthread的更高层的封装,对

C.NSThread需要自己管理线程的生命周期

D.GCD可以根据不同优先级分配线程,对

*97.iOS中的数据持久化方式(D)

A.属性列表

B.对象归档

C.SQLite和CoreData

D.以上全部+对象归档

98.设有一下宏定义:

#defineN4

#defineY(n)((N + 1) * n)

则执行语句: Y(5 + 1)为:(26)

99.如下程序用于把"blue"字符串返回,请指出其中的错误.

//不确定

char *GetBlue()

{

char *pcColor;

char*pcNewColor;

pcColor = “blue”;

pcNewColor =(char*)malloc(strlen(pcColor));

strcpy(pcNewColor, pcColor);

return pcNewColor;

}

答:strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, c*****t char *src);将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们控制的,所以这个字符串拷贝很容易出错

100.常见的object-c的数据类型有哪些,和C的基本数据类型有什么区别?如:NSInteger和int

答:object的数据类型由NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,而C语言的基本数据类型int,只是一定字节的内存空间,用于存放数值,NSInteger是基本的数据类型,并不是NSNumber的子类,当然也不是NSObject的子类。NSInteger是基本数据类型int或者Long的别名(NSInteger的定义typedef long NSInteger)它的区别在于,NSInteger会根据系统是32位还是64位来决定是本身int还是long.

101.iOS有垃圾回收机制吗?它是以怎样的机制来工作的?

答: OC是支持垃圾回收机制的(Garbage collection简称GC),但是apple的移动终端中,是不支持GC的,Mac桌面系统开发中是支持的.

移动终端开发是支持ARC(Automatic

Reference Counting的简称),ARC是在IOS5之后推出的新技术,它与GC的机制是不同的。我们在编写代码时,不需要向对象发送release或者autorelease方法,也不可以调用delloc方法,编译器会在合适的位置自动给用户生成release消息(autorelease),ARC的特点是自动引用技术简化了内存管理的难度.

102.请使用gcd完成如下任务,执行并发任务task1,task1完成后update UI.

答:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//task1:

NSLog(@"执行task1");

//更新UI

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"更新UI");

});

});

103.为什么在主线程中更新UI?子线程中想要更新UI怎么做?

答:(1)在子线程中不能更新UI,除了极少数UI外,其他UI更新要等到子线程执行完毕后回到主线程中进行更新。如果子线程一直在运行,则子线程中UI更新的函数栈主线程无法得知,即UI无法更新;

(2)回到主线程中进行UI更新;

104.简述通过Storyboard实现一个tableView

(自定义cell的关键步骤).

答:首先创建自己的自定义cell的类,我们叫做CustomCell,要继承于UITableViewCell。在这个类中定义自己所需要的控件。

然后,打开storyboard,选择自己要添加自定义cell的UIViewController,我们叫它为ViewController。在UITableView里面添加一个cell(或者修改原有的cell)。将cell的style改为custom,将cell的类改为CustomCell,将identifier改为CustomCellIdentifier。然后,可以在cell中添加控件,将控件和刚才在CustomCell中定义的控件连起来。

最后,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中添加以下代码:

[plain]

CustomCell*cell=[tableViewdequeueReusableCellWithIdentifier:@"CustomCellIdentifier"];

这样,就创建了一个cell,可以在这句代码之后对自己添加的控件进行设置。

105.如何生成同时支持多个架构(simulator,arm7,arm64)的通用静态库?

答:ValidArchitectures设置为:armv7|armv7s|arm64|i386|x86_64;

Architectures设置不变(或根据你需要):armv7|arm64;

然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a进行合包,使用lipo -create真机库.a的路径模拟器库.a的的路径-output合成库的名字.a;

这样就制作了一个通用的静态库.a;

106.请写出一个xml文件,用于描述一个书架,书架上有2本书,书本的类别(category)分别是cooking,children.要求tag中包含书名(title),作者(author).类别(category)要用属性表示.

答:

书名1<\title>

作者1<\author>

<\book>

书名2<\title>

作者2<\author>

<\book>

107.strcpy和memcpy的最大区别是什么?

答:1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第

3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

108.g++, ld是什么?声明编译选项–DSUPPORT_BLUETOOTH =

1有什么作用?

答: g++是GNU的c++编译器;

109.@class用途

答:@class一般用于头文件中声明某个类的实例变量的时候用到.它只是声明,至于内部的实现是没有告诉编译器的.

110.delegate使用assign or retain简述理由.

答:assign,防止出现循环引用;

111.NSString与NSData之间的转换过程中要特别注意的事项是什么?

解:NSString转换成NSData对象

NSData* xmlData = [@"testdata"dataUsingEncoding:NSUTF8StringEncoding];

NSData转换成NSString对象

NSData * data;

NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];

NSData转换成char*

NSData *data;

char *test=[data bytes];

char*转换成NSData对象

byte* tempData = malloc(sizeof(byte)*16);

NSData *content=[NSData dataWithBytes:tempData length:16];

转换过程中要注意NSData的编码格式问题.

解决方法:

先设置断点然后在控制台po出NSData的变量,看看会显示什么。

如果po出的NSData是可阅读的,直接能看到文本的内容,则使用[NSString stringWithFormat:NSData] (这里的NSData指的是你需要转换成NSString的NSData变量)即可。

如果po出的NSData是不可阅读的乱码,那一般都是有编码格式的,最常用的是NSUTF8StringEncoding,另外还有NSASCIIStringEncoding等,你可以在Apple文档里找到编码格式的那个枚举类型,挨个尝试。

112.请用代码如何判断某个对象obj是否支持某个method.

解:if ([srespondsToSelector:@selector(print:)]) {

[s print:@"支持这个方法"];

}

113.请用简单的代码展示@protocol的定义及实现.

解: #warning代理第一步:声明协议

@protocol MarryMe

-(void)makeMoney;

@end

#warning代理第二步:声明代理

@property(nonatomic,assign)id myDeleget;

.m文件中

#warning代理第三步:代理人执行协议方法

[self.myDeleget makeMoney];

代理人.m文件中

#warning代理第四步:签订协议

@interface Boy : NSObject

Girl *girl = [[Girl alloc] init];

#warning代理第五步:成为代理人

girl.myDeleget = self;

[girl getMessage:message];

#warning协议代理第六步:实现协议方法

-(void)makeMoney{

NSLog(@"aaa");

}

/*不是iOS的题*/114.请讲述Indesign中主页作用

115.请描述应聘岗位的未来职业规划

解:答案不唯一,如有需要请自行规划活着百度.

116.3升的杯子一个,5升的杯子一个,杯子的形状不规则,问怎么才能得到4升的水,水无限多.(请写出推理过程)

解:先将5升的杯子倒满,然后把5升的杯子中的水倒入3升的杯子,倒满后5升的杯子剩下2升.再把3升杯子中的水倒掉,把5升的杯子中剩余的2升水倒入3升的杯子中,然后把5升的杯子倒满.再用5升的杯子中的水给3升的杯子添满,则5升的杯子中剩余4升的水.

117.数据持久化存储方案有哪些?

解:所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,数据持久化的方案有5种方案:

plist文件(属性列表)

preference(偏好设置)

NSKeyedArchiver(归档)

SQLite 3

CoreData

118.网络通信用过哪些方式?

解: ios设备的网络通信的方法,有如下两个大类:

1、使用socket的方式进行通信。

2、使用asynsocket类库进行通信。

119.如何处理多个网络请求并发的情况?

解: //了解(并发)当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

遇到这种情况建议使用第三方的网络库。比如AFNetworking。也可以通过GCD和NSOperationQueue来控制并发

120.简单介绍一下KVC和KVO,他们都可以应用在哪些场景?

解: KVO:键值监听,观察某一属性的方法

KVC:键值编码,是一种间接访问对象的属性

121.讲述一下runtime的概念,message

send如果寻找不到响应的对象,会如何?

Objc Runtime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。

122. iOS能否嵌入其他语言?如何实现?

不会!!!!!

123. iOS移动开发最终生成的是什么文件?其结构如何?

最后打包完成是一个.ipa文件可以通过iTunes和其他工具对有测试资格的手机进行安装

124. UINavigationController如何要使用push/pop功能的话,需要怎么实现

1.用UINavigationController的时候用pushViewController:animated

----返回之前的视图[[selfnavigationController] popViewControllerAnimated:YES];

---ps:push以后会在navigation的left bar自动添加back按钮,它的响应方法就是返回。所以一般不需要写返回方法,点back按钮即可。

2.其他时候用presentModalViewController:animated

[selfpresentModalViewController:controller animated:YES];//YES有动画效果

-----返回之前的视图[selfdismissModalViewControllerAnimated:YES];

3.切换视图一般用不到addSubview

UINavigationController是导航控制器,如果pushViewController的话,会跳转到下一个ViewController,点返回会回到现在这个ViewController;

如果是addSubview的话,其实还是对当前的ViewController操作,只是在当前视图上面又“盖”住了一层视图,其实原来的画面在下面呢,看不到而已。

125. UIView如何需要重新绘制整个界面,需要调用什么方法?

UIView setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。

综上所述:setNeedsDisplay方便绘图,而layoutSubViews方便出来数据

setNeedDisplay告知视图它发生了改变,需要重新绘制自身,就相当于刷新界面.

126. Plist文件?结构是?

Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息,该功能在旧式的Mac OS中是由资源分支提供的。

Plist主要有Core Fundation类型构成,也可以将这些类型放入NSDictionary和NSArray以便后塍更复杂的数据类型

127. iOS里面的二进制数据类型是什么?和NSString如何互相转换?

NSData:用于存储二进制的数据类型

NSData类提供了一种简单的方式,它用来设置缓冲区、将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件。

不变缓冲区(NSData类),也可定义可变的缓冲区(NSMutableData类)。

NSData、NSString互转:

NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];

//NSString转换成NSData类型

NSString * newStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

128. iOS里面是否有GBK的字符编码描述?即NSUTF8StringEncoding如果有,是怎样的?

不会

129. iOS里面的手势是如何实现的?

130.谈谈你了解的设计模式,你用过哪些,他们的缺点

1.MVC:优点:

1、开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、有利于标准化;

5、利于各层逻辑的复用。

缺点:

1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

2.观察者模式优点:

1、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。

2、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,

观察者模式缺点:

1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。

3、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。

4、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。

3.单例模式:主要优点:

1、提供了对唯一实例的受控访问。

2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

3、允许可变数目的实例。

3.单例模式:主要缺点:

1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

2、单例类的职责过重,在一定程度上违背了“单一职责原则”。

3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失.

131.数据持久化存储方案有哪些?

答:

(附网址:http://www.cocoachina.com/industry/20130328/5908.html)

iOS中的数据持久化方式,基本上有以下四种:属性列表、对象归档、SQLite3和Core Data

1.属性列表(NSUserDefaults,用于存储配置信息)

涉及到的主要类:NSUserDefaults,一般[NSUserDefaults standardUserDefaults]就够用了

2.对象归档

要使用对象归档,对象必须实现NSCoding协议.大部分Object C对象都符合NSCoding协议,也可以在自定义对象中实现NSCoding协议,要实现NSCoding协议,实现两个方法

3.SQLite3

SQLite的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。

4.Core Data

Core Data本质上是使用SQLite保存数据,但是它不需要编写任何SQL语句。

要使用Core Data,需要在Xcode中的数据模型编辑器中设计好各个实体以及定义好他们的属性和关系。之后,通过操作这些对象,结合Core Data完成数据的持久化:

132.网络通信用过哪些方式?

(附网址:http://blog.csdn.net/chang6520/article/details/7967698)

同样也是代码解释

iOS设备的网络通信的方法,有如下两个大类:

1、使用socket的方式进行通信。

以TCP为利,对于TCP来说,是要区分服务端和客户端的。服务端:通常的方法是服务端启动后监听,是否有客户端连接,如果有连接,则建立与客户端的通信。客户端的方法通常是连接服务端,当连接成功之后,就希望发送数据了。

2、使用asynsocket类库进行通信。

133.如何处理多个网络请求并发的情况?

答:

(附网址:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html)

答案都是代码,大家可以打开网址仔细阅读

1.并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

2.并行当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

3.区别并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。

134.简单介绍一下KVC和KVO,他们都可以应用在哪些场景?

答:

(附网址:http://blog.csdn.net/zhaozy55555/article/details/8598374

http://www.cnblogs.com/kenshincui/p/3871178.html)

KVC:NSKeyValueCoding的简称,是一种可以直接通过字符串的名字(key)来访问类属性的机制,而不是通过调用的Setter、Getter方法访问。

KVC的操作方法由NSKeyValueCoding协议提供,NSObject就实现了这个协议,也就是说如果对象是NSObject的子对象那么就支持KVC操作,KVC有两种操作方法,一种是设值,一种是取值,可以理解为getter和setter,不过稍微有所不同的是,设置对象值的方法中有两个,setValue:属性值forKey:属性名(一般的设置,比如说是说设置NSString,NSNumber等基本类类型,setetValue:属性值forKeyPath:属性路径

2.KVO:NSKeyValueObserving的简称,当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者,相当于设计模式中的观察者模式。

Key-Value Observing (KVO)建立在KVC之上,能够观察一个对象的KVC key path值的变化,接下来的做的实例是在iOS中视图的ViewDidLoad中实现的,跟KVC类似,不过可以监听值的变化,实现起来很简单addObserver添加观察,observeValueForKeyPath观察变化之后的事件,最后需要销毁以下监听事件,

135.实现多线程有哪些方法,分别有什么区别?

答: (http://www.cnblogs.com/hanjun/p/3667874.html)

1.NSThread

2.NSOperationQueue

3.GCD

区别:

Thread是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在iOS中我们可以使用多种形式的thread:

Cocoa threads:使用NSThread或直接从NSObject的类方法performSelectorInBackground:withObject:来创建一个线程。如果你选择thread来实现多线程,那么NSThread就是官方推荐优先选用的方式。

Cocoa operations是基于Obective-C实现的,类NSOperation以面向对象的方式封装了用户需要执行的操作,我们只要聚焦于我们需要做的事情,而不必太操心线程的管理,同步等事情,因为NSOperation已经为我们封装了这些事情。NSOperation是一个抽象基类,我们必须使用它的子类。iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation。

Grand Central Dispatch (GCD): iOS4才开始支持,它提供了一些新的特性,以及运行库来支持多核并行编程,它的关注点更高:如何在多个cpu上提升效率。

136.The ios/osx’s graphics is bassed onOpenGL . what is OpenGL?

iOS的/ OS X的图形是基于OpenGL。什么是OpenGL?

(附网址:https://developer.apple.com/opengl/)

官方的解释:OpenGL是硬件基础图形加速在OS X的权力核心动画,核心形象,和石英的极端和给你的应用程序访问惊人的3D图形处理能力。使用工业标准的图形API创建一系列应用程序,包括游戏,动画制作软件,以及医疗成像解决方案。

百度的解释:

OpenGL:(Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术。OpenGL就是支持这种转换的程序库,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。OpenGL被设计成独立于硬件、独立于窗口系统,在各种操作系统的计算机上都可用的,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库

137.What is CoreFoundation framework,andwhat is Foundation frame-work

什么是框架的CoreFoundation,什么是Foundation框架

答:

(附:文顶顶网址http://www.cnblogs.com/wendingding/p/3710820.htmlhttp://blog.csdn.net/annkey123/article/details/8271867)

Core Foundation框架(CoreFoundation.framework)是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。

Foundation—基础框架。框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础。

如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了。

即#import

补充:core foundation框架相对底层,里面的代码几乎都是c语言的,而foundation中是OC的。

138.How do you save data for you app

你如何保存你的应用程序数据

答:

(附网址:应用数据存储方式

(XML属性列表-plist): http://www.cnblogs.com/ wendingding/p/3773867.html

(偏好设置):http://www.cnblogs.com/wendingding/p/3775178.html

(归档):http://www.cnblogs.com/wendingding/p/3775293.html)

ios应用数据存储方式(XML属性列表-plist)ios应用常用的数据存储方式

1.plist(XML属性列表归档)

2.偏好设置

3.NSKeydeArchiver归档(存储自定义对象)

4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储)

5.Core Data(对象型的数据库,把内部环节屏蔽)

139.Do you use GIT version control?What isthe difference between merge and rebase ? If you are not using GIT ,are youusing any distributed version control system?

您是否使用Git版本控制?什么是合并和重订之间的区别?如果你没有使用Git,您使用的分布式版本控制系统?

答:建议大家使用百度翻译打开网址以下均是英文解释

(附网址:什么是版本控制:https://git-scm.com/book/zh/ch1-1.html

国外网友的解释:http://translate.baiducontent.com/transpage?query=http%3A%2F%2Fserve.3ezy.com%2Fstackoverflow.com%2Fquestions%2F16666089%2Fwhats-the-difference-between-git-merge-and-git-rebase&from=en&to=zh&source=url

合订和重定的解释:http://translate.baiducontent.com/transpage?cb=translateCallback&ie=utf8&source=url&query=http%3A%2F%2Fserve.3ezy.com%2Fgit-scm.com%2Fbook%2Fen%2FGit-Branching-Rebasing&from=en&to=zh&token=&monLang=zh

视频的网址:http://www.git-tower.com/learn/git/videos/)

140.Storyboard or Xib, which do youprefer?And why

Storyboard和Xib你喜欢哪个为什么?

答:

(附网址:http://blog.mobilejazz.com/storyboards-xibs-best-practices/)

喜欢哪个大家可以选择:以下是Storyboard和Xib的优缺点可以参考以下

以下解释是英文翻译过来的(建议大家可以看网址原文章)

xibs是XML文件定义和配置的一组对象,并专门操纵主要观点(UIView子类)。Xcode具有友好的编辑器,可以显示这些意见,它是一个运行的应用程序,使得它的配置和设计布局非常容易(节省很多行代码)。

即使大多数开发商关联一个xib文件“屏幕”或“视图控制器”,是通用的容器xibs对象和可以一起使用,与其它类型的对象作为nsobjects UIViews,或者只是一个人。

Storyboard

这是一个XML文件代表统一一套xibs为了定义导航之间的一组视图控制器。有一个故事一个开发者可以定义多个“屏幕”(或和导航之间的UIViewController类)他们。

作为一个差的XIB,故事是由定义的视图和导航处理他们之间。

xibs VS代码的好处

视图的可视化配置。

自动布局的视觉形态。

大小班的视觉形态。

节省时间和代码,而“创建实例”。

节省时间和代码,而“配置对象”。

快速UITableViewCell原型。

快速配置控制动作(ibactions)。

Storyboard与xibs效益

可以直接在脚本本身原型的行

可以定义静态表格部分和行。

可以使用自动布局约束添加到toplayoutguidebottomlayoutguide。

可以指定导航和过渡(这是一个主要的目的!)。

可以定义多个“屏幕”(处理的)在一个地方(不需要多xibs)。

对xibs VS代码不便

容易破裂合并时(GIT)。

不复杂的自动布局定义。

不能引用(或包括)其他xibs。

Storyboard与代码xibs不便

故事情节是:大文件的加载速度慢,有时。

需要一个大屏幕显示所有(或部分)的内容。

容易破裂合并时(GIT)。

高概率打破它时,合并(GIT)作为故事包含很多信息。

许多警告当支持iOS 7和iOS 8(利润,大小班)。

不能引用(或包括)其他xibs。

151. Aside from regular tasks like

reading/writing element, getting the count of an array, can you write something

else you can do to an NSArray with only the built-in SDK? E.g, how do you

filter(过滤器), map, an NSArray?

不会

152.Do you use SDWebImage? If yes, why doyou choose this library? If no, how do you load an image from Internet to anUIImageView?

翻译:你使用SDWebImage吗?如果使用,你为什么使用这个库,如果不使用,你是怎样加载一张网络图片的?

答案:这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。

156.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢?为什么

NSMutableArray* ary = [[NSMutableArrayarray] retain]; //2

NSString *str = [NSStringstringWithFormat:@"test"];//1

[str retain];// 2

[ary addObject:str]; // 3

NSLog(@"%d", [str retainCount]);

[str retain];// 4

[str release];// 3

[str release];// 2

NSLog(@"%d", [str retainCount]);//2

[ary removeAllObjects]; // 1

NSLog(@"%d", [strretainCount]);

结果:3、2、1

157.Storyboard or Xib, which do you

prefer?And why?

你喜欢使用Storyboard还是Xib?为什么?

详细解释:“http://stackoverflow.com/questions/13834999/storyboards-vs-the-old-xib-way”

答案: The reasons for liking Storyboard:There are things you can do with

a storyboard that you can't do with a nib. A storyboard lets you create segues

between view controllers, and it lets you design table view cells in-place. One

big advantage of Storyboard is the ability to view your entire application's

GUI(图形用户界面)flow. Zoom out and you can see how everything interconnects andflows.

The reasons for liking Xib : There are

things you can do with a nib that you can't do with a storyboard. In a nib, you

can create references to the File's Owner placeholder(占位符). You

can create multiple top-level views, edit them, and create connections between

them. See this answer for an example of why you'd want to do that. You can add

external(外部的)object placeholders (a rarely-used feature很少使用的功能).

1.Apartfrom the historical value in the xib approach, xib's also provide modularity.Perhaps you have a library of code or wish to share a useful widget you made.Taking the xib approach would facilitate that sharing and reuse.

2.Thexib approach also allows you some greater flexibility in terms of your owncode.

3.Withxibs, while the modularity is nice, it's tougher to envision how everythingconnects and flows together. This can be a useful feature for yourself, or ifyou have a larger team to share with, to allow others to see how the app flows.

158. if you’ve started using Swift,writedown one or two features that is presenting Swift which is not Objective-C, andhow it helps you

英语翻译:如果你已经使用了Swift,写出一个或两个Swift有而OC没有的功能,它是怎样帮助你的?

答案:可选类型(optionals)、元组(tuples)、泛型(generics),类型推断(type inference)以及其他等等。(答案不全)

159. How do you do abackground task(后台任务)in iOS,indifferent ways ? And which one doyou prefer

翻译:你怎样用一种不同的方式做一个后台任务,你喜欢哪一种方式?

答案:http://www.2cto.com/kf/201402/278626.html

160.static关键字的作用?

在C语言中,关键字static有三个明显的作用:

1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

161.堆和栈的区别?

堆和栈的区别:

一、堆栈空间分配区别:

1、栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

2、堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二、堆栈缓存方式区别:

1、栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;

2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三、堆栈数据结构区别:

堆(数据结构):堆可以被看成是一棵树,如:堆排序;

栈(数据结构):一种先进后出的数据结构。

162.目标~动作机制

目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)

的形式保有其动作消息的目标。

动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。

程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制

163.自动释放池是什么,如何工作?

一、什么是自动释放池

1、Autorelease pool

自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放

自动释放池本事销毁的时候,池子里面所有的对象都会做一次release操作

2、autorelease

任何OC对象只要调用autorelease方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池)。

二:O-C当中的内存释放,并不是像java/.net那样有一个自动的释放池,开发人员不用去关心有关内存释放的问题,O-C里面的自动释放池比c语言的手动内存管理要好一些,但是相对于java/.net来说又弱一些,所以说O-C当中的释放属于半自动的释放池。

三、如何创建一个自动释放池

//ios5.0新方式

@autoreleasepool

{

}

//ios5.0之前的老方式

NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];

[pool release];

四、自动释放池如何释放对象内存

黄金法则:如果对一个对象使用了alloc,[mutable]copy,retain,那么必须使用相应的release或者autorelease.

164.obj-c的优点

objc优点:

1) Cateogies

2) Posing

3)动态识别

4)指标计算

5)弹性讯息传递

6)不是一个过度复杂的C衍生语言

7) Objective-C与C++可混合编程

缺点:

1)不支援命名空间

2)不支持运算符重载

3)不支持多重继承

4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。

OC没有多重继承,Java也没有C++才有

OC使用协议来实现多重继承

165.什么时候用delegate,什么时候用Notification

1.参数的不同

使用delegate参数更加直观,使用notification参数不那么直观,所以能使用delegate的地方,尽量使用delegate

2.传递的长度

有时候你的页面会一次跳好几个页面,那么你想把这个页面的数据传回到底层是很麻烦的事情,因为你要把delegate指针从底层界面一直传上来。

3.传递多个数据

当你在同一个对象传递给多个对象,用delegate就不可行了。

166.什么是KVC和KVO?

1、KVC,即是指NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO就是基于KVC实现的关键技术之一。

2、KVO的是KeyValue

Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。iOS中有个Notification的机制,也可以获得通知,但这个机制需要有个Center,相比之下KVO更加简洁而直接。

167.类别的作用

作用:

1对系统的类或自己定义的类的扩充(只是指,不能声明属性Instance variable)e.g. base64 MD5.但是不能保证所有的方法都能被调用。尤其是在指定一个与系统的方法相同的方法时一定要注意。

文件名:NSString+additions.h

NSString+additions.m

@interface NSString (Base64)

2可以声明私有方法。

ZYViewController.m

@interfaceZYViewController (additions)

//{

//BOOL isOK;

//}

- (void)ok;

@property

@end

3可以声明分散类的方法(NSIndexPath)

分散类体现出类别不仅可以扩充系统的方法,而且可以扩充自己定义的类。

由第3个作用可知:不管是否使用的分散类在任何的.h文件中,我只考虑类别中的方法包裹在@interface className ..@end,那么我只明确将来类别中的方法就属于className这个类。

168.浅复制和深复制的区别

简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!

我列举一个例子来说吧:

你正在编写C++程序中有时用到,操作符的重载。最能体现深层拷贝与浅层拷贝的,就是‘=’的重载。

看下面一个简单的程序:

class string{

char *m_str;

public:

string(char *s){

m_str=s;

}

string()

{};

String & operator=(const string s){

m_str=s.m_str;

return *this

}

};

int main(){

string s1("abc"),s2;

s2=s1;

cout<

上面的=重载其是就是实现了浅拷贝原因。是由于对象之中含有指针数据类型.s1,s2恰好指向同一各内存。所以是浅拷贝。而你如果修改一下原来的程序:

string&operator=(const string&s){

if(strlen(m_str)!=strlen(s.m_str))

m_str=new char[strlen(s.m_str)+1];

if(*this!=s)

strcopy(m_str,s.m_str);

return *this;

}

这样你就实现了深拷贝,原因是你为被赋值对象申请了一个新的内存所以就是深拷贝。

169.代理的作用

代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。

另外一点,代理可以理解为java中的回调监听机制的一种类似。

170.我们说的OC是动态运行时语言是什么意思?

多态。

主要是将数据类型的确定由编译时,推迟到了运行时。

这个问题其实浅涉及到两个概念,运行时和多态。

简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多态:不同对象以自己的方式响应相同的消息的能力叫做多态。

意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。

也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。

因此也可以说,运行时机制是多态的基础。

171.什么是ARC?请简述一下ARC的原理。

1)ARC是iOS 5推出的新功能,全称叫ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了

2)、ARC的规则就是只要对象没有强指针引用,就会被释放掉,换而言之只要还有一个强引用指针变量指向对象,那么这个对象就会存在内存中。弱指针指向的对象,会被自动变成空指针(nil指针),从而不会引发野指针错误。

172.简述视图控制器的生命周期。

1)、init函数(init;initWithFrame;initWithCoder;等)--初始化

2)、awakeFromNib--在loadView之前的工作放在这里

3)、viewDidLoad--注意,一个ViewController一个生命周期内这个函数只会调用一次

4)、viewWillAppear--view将要出现,每次View消失再出现都会调用

5)、viewWillLayoutSubviews--简要对子试图进行布局

6)、viewDidLayoutSubivews--完成对子试图布局

7)、viewDidAppear--视图将要出现在屏幕上

---上述代码不含部分

8)、viewWillDisappear--View将要消失

9)viewDidDisappear--View已经消失

173.请描述一下线程的生命周期。

新建(new Thread)、就绪(runnable)、运行(running)、死亡(dead)、堵塞(blocked)

174.请至少列举5个常用的设计模式。

1)、代理模式2)、观察者模式3)、MVC模式4)、单例模式5)工厂模式

175.如何增强iOS应用程序的性能。

初级

1、使用ARC进行内存管理、2.在适当的情况下使用reuseIdentifier

3.尽可能将View设置为不透明(Opaque)4.避免臃肿的XIBs 5.不要阻塞主线程6.让图片的大小跟UIImageView一样7.选择正确的集合8.使用GZIP压缩

中级:

9.重用和延迟加载View 10.缓存、缓存、缓存11.考虑绘制12.处理内存警告13.重用花销很大的对象14.使用Sprite

Sheets 15.避免重新处理数据16.选择正确的数据格式17.设置适当的背景图片18.降低Web内容的影响19.设置阴影路径20.优化TableView 21.选择正确的数据存储方式

高级

22.加速启动时间23.使用Autorelease

Pool 24.缓存图片—或者不缓存25.尽量避免Date格式化

176.请列举至少五个iOS中常用的第三方类库。

1).AFNetworking

2). SDWebImage

3). shareKit

4). FMDatebase

5). MMDrawerController

177.队列和栈有什么区别。

栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表

队列(Queue)是限定只能在表的一段进行插入和在另一端进行删除操作的的线性表

1)、队列是先进先出,栈是先进后出

2)、遍历数据速度不同,队列遍历速度要快得多

178.常用的XML文件的解析方式有哪些?它们各自的区别是什么?

1)、有两种解析方式:DOM解析与SAX解析

2)、DOM解析必须先完成DOM树的创建,在处理规模较大XML文档时就很耗内存,占用资源较多

3)与DOM不同,SAX是用事件驱动模型,解析XML时每遇到一个开始或结束标签、或者属性、或者一条指令时,程序就会产生一个事件进行相应的处理,因此,SAX相对于DOM来说更适合操作较大的XML文档

179.请介绍几个常用的git命令。

git branch查看本地所有分支、git status查看当前状态、git commit提交、git branch -a查看所有的分支、git

branch -r查看本地所有分支

180.请简单描述一下自己的职业生涯规划。

不知道

181.static关键字的作用

答案:

(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;

(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

182.堆和栈的区别?

答:答:栈完全是由系统管理的,堆是由程序员自己控制管理的,包括内存空间的开辟和释放.栈是先进后出.

183.目标-动作机制?

答:目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)

的形式保有其动作消息的目标。

动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。

程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制

184.自动释放池是什么,如合工作?

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

185. obj-c的优缺点

答: objc优点:

1) Cateogies

2) Posing

3)动态识别

4)指标计算

5)弹性讯息传递

6)不是一个过度复杂的C衍生语言

7) Objective-C与C++可混合编程

缺点:

1)不支援命名空间

2)不支持运算符重载

3)不支持多重继承

4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。

OC没有多重继承,Java也没有C++才有

OC使用协议来实现多重继承

186.什么时候用delegate,什么时候用Notification?

答: Delegate

消息的发送者(sender)告知接受者(receiver)某个事件将要发生, delegate同意后发送者响应事件,delegate机制使得接受者可以改变发送者的行为.

1/传值

b把自己的数据和对象传给a,让a去展示或处理

2/传事件

delegate的优势:

1.非常严格的语法。所有将听到的事件必须是在delegate协议中有清晰的定义。

2.如果delegate中的一个方法没有实现那么就会出现编译警告/错误

3.协议必须在controller的作用域范围内定义

4.在一个应用中的控制流程是可跟踪的并且是可识别的;

5.在一个控制器中可以定义定义多个不同的协议,每个协议有不同的delegates

6.没有第三方对象要求保持/监视通信过程。

7.能够接收调用的协议方法的返回值。这意味着delegate能够提供反馈信息给controller

Notification

消息的发送者告知接受者事件已经发生或者将要发送(接受者不能影响发送者的行为)

消息接受者通过keyPath的方式指定需要接受的消息类型,通常在对象初始化完成之后声明开始接收消息在对象被销毁前注销接收消息.

notification优势:

1.不需要编写多少代码,实现比较简单;

2.对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单

Delegate和Notification区别

1/二者都用于传递消息.

delegate针对one - to - one关系receiver可以返回值给sender.

notification用于one - to - one /

many / none关系receiver无法返回值给sender.

2/delegate两者之间必须建立联系否则没办法调用代理方法.

notification不需要两者之间有联系.

3/delegate用于希望sender接受到receiver的某个功能值反馈

notification用于通知多个object某个事件

4/notification通过维护一个array,实现一对多消息的转发

187.什么是KVC和KVO?

答: Key value coding,Key value observer.

Kvc是路径访问的规范,kvo是观察某个变量的变化过程

KVO可以观察某个对象的变量变化过程,KVC是满足被观察的编

码规范。

KVC/KVO类似于代理,通知中心。都是一种通讯方法。

188.类别的作用?

答:类别主要有3个作用:

(1)将类的实现分散到多个不同文件或多个不同框架中。

(2)创建对私有方法的前向引用。

(3)向对象添加非正式协议

189.浅复制和深复制的区别?

答:简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!

190.代理的作用?

答:作用有两个,一个是传值,一个是传事件

191.我们说的OC是动态运行时语言是什么意思?

多态。

答:主要是将数据类型的确定由编译时,推迟到了运行时。

这个问题其实浅涉及到两个概念,运行时和多态。

简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多态:不同对象以自己的方式响应相同的消息的能力叫做多态。

意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。

也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。

因此也可以说,运行时机制是多态的基础。

198.Object–C的类可以多重继承吗?可以实现多个接口吗?

Category是什么?重写一个类的方法用继承好还是分类好?为什么?

答案:Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

199..属性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非原子操作,atomic原子性操作。原子性指的是一个操作不可以被中途cpu暂停然后调度,即不能被中断,要不就执行完,要不就不执行,就是为了多线程安全的。

一般使用nonatomic。

201.内存管理的几条原则是什么?按照默认法则,哪些关键字生成的对象需要手动释放,在和property结合的时候怎样有效的避免内存泄露?

答:当使用new、alloc或copy方法创建一个对象时,该对象引用计数器为1。如果不需要使用该对象,可以向其发送release或autorelease消息,在其使用完毕时被销毁。

如果通过其他方法获取一个对象,则可以假设这个对象引用计数为1,并且被设置为autorelease,不需要对该对象进行清理,如果确实需要retain这个对象,则需要使用完毕后release。

如果retain了某个对象,需要release或autorelease该对象,保持retain方法和release方法使用次数相等。

使用new、alloc、copy关键字生成的对象和retain了的对象需要手动释放。设置为autorelease的对象不需要手动释放,会直接进入自动释放池。

202.堆和栈什么区别?

答:一、堆栈空间分配区别:

1、栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

2、堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二、堆栈缓存方式区别:

1、栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;

2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三、堆栈数据结构区别:

堆(数据结构):堆可以被看成是一棵树,如:堆排序;

栈(数据结构):一种先进后出的数据结构。

203.描述一下iOS SDK中如何实现MVC设计模式?

答:

MVC是模型、试图、控制开发模式,对于iOS

SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。

204.iOS数据持久化方式有哪些?

205和199一样删除205

206.自动释放池是什么,如何工作?

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

207. if you can Android/Windows Phone,write something about the comparison between it and iOS

翻译如果你有Android /

Windows Phone的手机,写一些关于它与iOS设备之间的比较

答案:自己发挥

208. Write something about the differencesbetween Objective-C and C++.

翻译写一些关于Objective-C和C++之间的差异

答案:

1、Objective C基本上是在C +

Smalltalk基础上衍生出来的,C++就是C++。除了都是从C语言分化出来的以外,完全没有任何共性。

2、最大的区别就是Objective C的成员函数调用是基于动态绑定的,类本身并没有限制对象可以有什么函数。相对于C++类会规定好成员有什么函数。这使得Objective C的灵活性很大,但是执行效率也很低。

3、在NeXT系统的时代C++和Objective C都不是那么大众的东西,C++也还没完善,而且那个时代编译器的有优化能力也没现在那么变态。所以选择Objective C也不是很奇怪的事。但是现在Objective C的劣势就越来越明显了,所以苹果开发了Swift,而且就内部消息苹果很可能会准备放弃OC。

209. __unsafe_unretained vs__weak; purposeof __block; NSString const * vs NSString *const

unsafe_unretained往往都是用来声明属性的,如果想声明临时变量就得用__strong,__weak,__unsafe_unretained,__autoreleasing;

block闭包就是能够读取其它函数内部变量的函数;

NSString const *HSCoder = @"汉斯哈哈哈";

"*HSCoder"不能被修改,"HSCoder"能被修改

NSString * const HSCoder = @"汉斯哈哈哈";

"HSCoder"不能被修改,"*HSCoder"能被修改

210. Write something about what you achievedby and what you learned from the UITableView class

首先,Controller需要实现两个delegate,分别是UITableViewDelegate和UITableViewDataSource然后UITableView对象的delegate要设置为self,注册cell,之后给定分区数和行数,注意cell的重用机制,可以设置系统cell或者自定义cell

211.你对天健公司有哪些了解?你为什么愿意成为天健公司的一员?

212. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码,方法又是什么?

线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;

在主线程执行代码,方法是performSelectorOnMainThread,

如果想延时执行代码可以用performSelector:onThread:withObject: afterDelay:或者使用GCD的函数:dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

// 2秒后异步执行这里的代码...

});

213.描述一下iOS SDK中如何实现MVC的开发模式

MVC是模型、视图、控制器开发模式,对于iOS

SDK,所有的View都是视图层的,它应该独立于模型层,由视图器来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是视图器,由它负责控制视图,访问模型数据。

214.简述浅拷贝和深拷贝

答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。

深层复制:复制引用对象本身。

意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源

还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了

两份独立对象本身。

用网上一哥们通俗的话将就是:

浅复制好比你和你的影子,你完蛋,你的影子也完蛋

深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

215.在iPhone应用中如何保存数据?

XML属性列表(plist)归档

Preference(偏好设置)

NSKeyedArchiver归档(NSCoding)

SQLite3

Core Data

216.ViewController的didReceiveMemoryWarning怎么被调用:

1、当程序收到内存警告时候ViewController会调用didReceiveMemoryWarning这个方法。

2、调用了这个方法之后,对view进行释放并且调用viewDidUnload方法

3、从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。

217.写一个委托的interface

1.声明一个协议(只有.h文件)

#import

@protocal协议名superMan<父协议NSObject>

@property NSString* name;

-(void)method;

@end

2.使一个类遵守协议

@interface TRMan:NSObject

多个协议要用,隔开

3.使用协议

id<协议名superMan>obj=[[TRMan alloc]init];

@ protocol MyDelegate

@interface MyClass : NSObject

@property(nonatomic,weak)id delegate;

@end

协议也可以没有独立文件,写在类里

#import

@class MyClass;

@protocol MyClassDelegate

-(void)protocolMethod;

@end

@interface MyClass : NSObject

@property(nonatomic,weak)id delegate;

@end

218.线程与进程的区别与联系

进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小只与处理机的位数有关,一个16位长处理机的进程空间大小为216,而32位处理机的进程空间大小为232。进程至少有5种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。

线程,在网络或多用户环境下,一个服务器通常需要接收大量且不确定数量用户的并发请求,为每一个请求都创建一个进程显然是行不通的,——无论是从系统资源开销方面或是响应用户请求的效率方面来看。因此,操作系统中线程的概念便被引进了。

线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是CPU调度的一个基本单位。

219.mvc设计模式是什么?你还熟悉什么设计模式

答:系统分为三个部分: Model. View. Controller.在cocoa中,你的程序中的每一个object

(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个.MVC课一帮助确保帮助实现程序最大程度的可重用性.各MVC元素彼此独立运作,通过分开这些元素,可以构建可维护,可独立更新的程序组建.

Delegate设计模式

Target-action设计模式

单例模式

220.什么是沙箱模式?哪些操作属于私有api范畴

某个iphone工程进行文件操作有此工程对应的指定的位置,不能逾越。

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.

documents,tmp,app,Library。

(NSHomeDirectory()),

手动保存的文件在documents文件里

Nsuserdefaults保存的文件在tmp文件夹里

Documents目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。

AppName.app目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,

所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。Library目录:这个目录下有两个子目录:Caches和Preferences

Preferences目录包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.

Caches目录用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。tmp目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。获取这些目录路径的方法:

1,获取家目录路径的函数:

NSString*homeDir=NSHomeDirectory();

2,获取Documents目录路径的方法:

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

NSString*docDir=[pathsobjectAtIndex:0];

3,获取Caches目录路径的方法:

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

NSString*cachesDir=[pathsobjectAtIndex:0];

4,获取tmp目录路径的方法:

NSString*tmpDir=NSTemporaryDirectory();

5,获取应用程序程序包中资源文件路径的方法:

例如获取程序包中一个图片资源(apple.png)路径的方法:

NSString*imagePath=[[NSBundlemainBundle]pathForResource:@”apple”ofType:@”png”];UIImage*appleImage=[[UIImagealloc]initWithContentsOfFile:imagePath];

代码中的mainBundle类方法用于返回一个代表应用程序包的对象。

文件IO写入

1,将数据写到Documents目录:

-(BOOL)writeApplicationData:(NSData*)datatoFile:(NSString*)fileName{

NSArray*paths=

NSUserDomainMask,YES);NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,

NSString*docDir=[pathsobjectAtIndex:0];

if(!docDir){

NSLog(@”Documentsdirectorynotfound!”);returnNO;

}

NSString*filePath=[docDirstringByAppendingPathComponent:fileName];

return[datawriteToFile:filePathatomically:YES];

}

2,从Documents目录读取数据:

-(NSData*)applicationDataFromFile:(NSString*)fileName{

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

NSString*docDir=[pathsobjectAtIndex:0];

NSString*filePath=[docDirstringByAppendingPathComponent:fileName];

NSData*data=[[[NSDataalloc]initWithContentsOfFile:filePath]autorelease];

returndata;

}

NSSearchPathForDirectoriesInDomains这个主要就是返回一个绝对路径用来存放我们需要储存的文件。

-(NSString*)dataFilePath{

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

NSString*documentsDirectory=[pathsobjectAtIndex:0];

return[documentsDirectorystringByAppendingPathComponent:@"shoppingCar.plist"];}

NSFileManager*fm=[NSFileManagerdefaultManager];

if(![fmfileExistsAtPath:[selfdataFilePath]]){

//下面是对该文件进行制定路径的保存

[fmcreateDirectoryAtPath:[selfdataFilePath]withIntermediateDirectories:YESattributes:nilerror:nil];

//取得一个目录下得所有文件名

NSArray*files=[fmsubpathsAtPath:[selfdataFilePath]];

//读取某个文件

NSData*data=[fmcontentsAtPath:[selfdataFilePath]];

//或者

NSData*data=[NSDatadataWithContentOfPath:[selfdataFilePath]];

}

iphone常见私有api的应用(比如直接发送短信,访问沙箱之外的磁盘文件).

221.描述一下iOS SDK中如何实现MVC的开发模式

MVC是模型、视图、控制器开发模式,对于iOS

SDK,所有的View都是视图层的,它应该独立于模型层,由视图器来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是视图器,由它负责控制视图,访问模型数据。

222.简述浅拷贝和深拷贝

//浅拷贝就比如像引用类型,而深拷贝就比如值类型。

浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。

深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。

C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。

浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.

深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

223.在iPhone应用中如何保存数据

//ios程序中数据数据存储有下列5种方式

XML属性列表(plist)归档、Preference(偏好设置)、NSKeyedArchiver归档(NSCoding)、SQLite3、Core Data

每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用的数据必须待在自己的沙盒里,其他应用不能访问该沙盒

224.假设有一个双向循环列队,每个节点保存了一个自然数,目前呈10,9,4,11的队列,代码写出一个向其中插入数字20的算法

//没找到

225.描述下tableView cell的重用机制,谈谈你是如何优化UITableView

//重用机制简单的说意思一行一行的cell都是在复用的,滑动tableview的时候,刚离开视图的cell会被放到复用池中,等下一个cell需要显示时,会先看复用池中有没有cell如果有的时候,就从复用池中拿出来cell,没有的话就重新创建cell

使用不透明视图。

不透明的视图可以极大地提高渲染的速度。因此如非必要,可以将table cell及其子视图的opaque属性设为YES(默认值)。

其中的特例包括背景色,它的alpha值应该为1(例如不要使用clearColor);图像的alpha值也应该为1,或者在画图时设为不透明。

不要重复创建不必要的table

cell。

前面说了,UITableView只需要一屏幕的UITableViewCell对象即可。因此在cell不可见时,可以将其缓存起来,而在需要时继续使用它即可。

而UITableView也提供了这种机制,只需要简单地设置一个identifier即可:

staticNSString *CellIdentifier = @"xxx"; UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) { cell =[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier] autorelease]; }值得一提的是,cell被重用时,它内部绘制的内容并不会被自动清除,因此你可能需要调用setNeedsDisplayInRect:或setNeedsDisplay方法。

此外,在添加table cell的时候,如果不需要动画效果,最好不要使用insertRowsAtIndexPaths:withRowAnimation:方法,而是直接调用reloadData方法。因为前者会对所有indexPaths调用tableView:cellForRowAtIndexPath:方法,即便该cell并不需要显示(不知道是不是bug),这就可能创建大量多余的cell。勘误:只是在模拟器上测试如此,真机调试时没有这种bug。

减少视图的数目。

UITableViewCell包含了textLabel、detailTextLabel和imageView等view,而你还可以自定义一些视图放在它的contentView里。然而view是很大的对象,创建它会消耗较多资源,并且也影响渲染的性能。

如果你的table

cell包含图片,且数目较多,使用默认的UITableViewCell会非常影响性能。奇怪的是,使用自定义的view,而非预定义的view,明显会快些。

当然,最佳的解决办法还是继承UITableViewCell,并在其drawRect:中自行绘制:

-(void)drawRect:(CGRect)rect { if (image) { [image drawAtPoint:imagePoint];self.image = nil; } else { [placeHolder drawAtPoint:imagePoint]; } [textdrawInRect:textRect withFont:font lineBreakMode:UILineBreakModeTailTruncation];}不过这样一来,你会发现选中一行后,这个cell就变蓝了,其中的内容就被挡住了。最简单的方法就是将cell的selectionStyle属性设为UITableViewCellSelectionStyleNone,这样就不会被高亮了。

此外还可以创建CALayer,将内容绘制到layer上,然后对cell的contentView.layer调用addSublayer:方法。这个例子中,layer并不会显著影响性能,但如果layer透明,或者有圆角、变形等效果,就会影响到绘制速度了。解决办法可参见后面的预渲染图像。

不要做多余的绘制工作。

在实现drawRect:的时候,它的rect参数就是需要绘制的区域,这个区域之外的不需要进行绘制。

例如上例中,就可以用CGRectIntersectsRect、CGRectIntersection或CGRectContainsRect判断是否需要绘制image和text,然后再调用绘制方法。

预渲染图像。

你会发现即使做到了上述几点,当新的图像出现时,仍然会有短暂的停顿现象。解决的办法就是在bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到屏幕,详细做法可见《利用预渲染加速iOS设备的图像显示》

不要阻塞主线程。

做到前几点后,你的table

view滚动时应该足够流畅了,不过你仍可能让用户感到不爽。常见的现象就是在更新数据时,整个界面卡住不动,完全不响应用户请求。

出现这种现象的原因就是主线程执行了耗时很长的函数或方法,在其执行完毕前,无法绘制屏幕和响应用户请求。其中最常见的就是网络请求了,它通常都需要花费数秒的时间,而你不应该让用户等待那么久。

解决办法就是使用多线程,让子线程去执行这些函数或方法。这里面还有一个学问,当下载线程数超过2时,会显著影响主线程的性能。因此在使用ASIHTTPRequest时,可以用一个NSOperationQueue来维护下载请求,并将其maxConcurrentOperationCount设为2。而NSURLRequest则可以配合GCD来实现,或者使用NSURLConnection的setDelegateQueue:方法。

当然,在不需要响应用户请求时,也可以增加下载线程数,以加快下载速度:

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate { if (!decelerate) {queue.maxConcurrentOperationCount = 5; } } -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {queue.maxConcurrentOperationCount = 5; } -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {queue.maxConcurrentOperationCount = 2; }此外,自动载入更新数据对用户来说也很友好,这减少了用户等待下载的时间。例如每次载入50条信息,那就可以在滚动到倒数第10条以内时,加载更多信息:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (count - indexPath.row< 10 && !updating) { updating = YES; [self update]; } }// update方法获取到结果后,设置updating为NO还有一点要注意的就是当图片下载完成后,如果cell是可见的,还需要更新图像:

NSArray*indexPaths = [self.tableView indexPathsForVisibleRows];for (NSIndexPath *visibleIndexPathin indexPaths) { if (indexPath == visibleIndexPath) { MyTableViewCell *cell =(MyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; cell.image= image; [cell setNeedsDisplayInRect:imageRect]; break; } }//也可不遍历,直接与头尾相比较,看是否在中间即可。最后还是前面所说过的insertRowsAtIndexPaths:withRowAnimation:方法,插入新行需要在主线程执行,而一次插入很多行的话(例如50行),会长时间阻塞主线程。而换成reloadData方法的话,瞬间就处理完了。

226.做过IM开发么,谈谈对XMPPFramework的了解

//XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开发。

XMPP中常用对象们

XMPPStream:xmpp基础服务类

XMPPRoster:好友列表类

XMPPRosterCoreDataStorage:好友列表(用户账号)在core

data中的操作类

XMPPvCardCoreDataStorage:好友名片(昵称,签名,性别,年龄等信息)在coredata中的操作类

XMPPvCardTemp:好友名片实体类,从数据库里取出来的都是它

xmppvCardAvatarModule:好友头像

XMPPReconnect:如果失去连接,自动重连

XMPPRoom:提供多用户聊天支持

XMPPPubSub:发布订阅

源码地址:http://code.google.com/p/xmppframework/,目前需要使用git才能download到源码。

227.你是如何实现多屏幕适配的

//一、iOS屏幕适配发展历程

设备

适配技术

4及以前(iPad未出)

直接用代码计算

有了iPad

autoResizing

有不同屏幕的iPhone后

autoLayout

有更多不同屏幕的iPhone后

sizeClass

二、各个技术的特性

1、autoLayout

帮我们确定在不同设备、不同(父view)环境下,同一个可视单元所应具有合适的位置和尺寸(任何两个视图的关系都可以确定)

1. autoLayout的用法:

ï直接建立约束条件

•[self.viewaddConstraint: [NSLayoutConstraintconstraintWithItem:blueView attribute:NSLayoutAttributeLeftrelatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeLeftmultiplier:1 constant:0]];

这样虽然代码量比较大,但是是绝对可行的办法,也是使用autoLayout最根本的办法之一。

ï使用VFL语言

- (void)viewDidLoad {

[super viewDidLoad];

UIButton *button=[[UIButtonalloc]init];

[button setTitle:@"点击一下"forState:UIControlStateNormal];

button.translatesAutoresizingMaskIntoConstraints=NO;

[button setBackgroundColor:[UIColorblackColor]];

[self.view addSubview:button];

NSArray *constraints1=[NSLayoutConstraint

constraintsWithVisualFormat:@"H:|-[button]-|"options:0 metrics:nil

views:NSDictionaryOfVariableBindings(button)];

NSArray *constraints2=[NSLayoutConstraint

constraintsWithVisualFormat:@"V:|-20-[button(==30)]"options:0metrics:nil

views:NSDictionaryOfVariableBindings(button)];

[self.viewaddConstraints:constraints1];

[self.viewaddConstraints:constraints2];

}

ï使用使用第三方库,如:Masonry、UIView+AutoLayout……

autoLayout的好处:

ï你基本上可以不用考虑3.5寸和4寸以及即将上市的x.x寸屏幕不同分辨率的问题,你终于可以不用在viewDidLoad方法里判断不同分辨率下,不同控件应该放在哪里,或者针对不同分辨率写不同的storyboard和xib;

ï你可以抛弃那些根据不同文字来计算tableViewCell、UILabel高度的代码了,因为autolayout会帮你自动计算好;

ï如果你的布局在横屏竖屏下变化不是特别大,你不用再为横着竖着写两套代码或者写两个storyboard/xib了;

2.sizeClass

在iOS8中,新增了Size Classes特性,它是对当前所有iOS设备尺寸的一个抽象。那我们就只把屏幕的宽和高分别分成三种情况:Compact:紧凑、Regular:宽松、Any:任意。

这样宽和高三三一整合,一共9中情况。如下图所示,针对每一种情况。我们可以在每种情况下设置不同的布局(包括控件的约束,甚至是控件是否显示)

sizeClass.png

对sizeClass的理解:sizeClass的实质是将iOS屏幕分成了不同的抽象概念,这些不同的抽象组合,对应着不同的设备屏幕。所以,利用sizeClass可以针对同一套UI,来适配所有的屏幕。注意:这些所有的适配,都是利用autoLayout来实现的,sizeClass只是负责提供不同的屏幕尺寸。

228.谈谈你了解的设计模式,你用过哪些,他们的优缺点

//(一)代理模式

应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。

优势:解耦合

敏捷原则:开放-封闭原则

实例:tableview的数据源delegate,通过和protocol的配合,完成委托诉求。

列表row个数delegate

自定义的delegate

(二)观察者模式

应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。

优势:解耦合

敏捷原则:接口隔离原则,开放-封闭原则

实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。

kvo,键值对改变通知的观察者,平时基本没用过。

(三)MVC模式

应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。

优势:使系统,层次清晰,职责分明,易于维护

敏捷原则:对扩展开放-对修改封闭

实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。

(四)单例模式

应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。

优势:使用简单,延时求值,易于跨模块

敏捷原则:单一职责原则

实例:[UIApplication sharedApplication]。

注意事项:确保使用者只能通过getInstance方法才能获得,单例类的唯一实例。

java,C++中使其没有公有构造函数,私有化并覆盖其构造函数。

object c中,重写allocWithZone方法,保证即使用户用alloc方法直接创建单例类的实例,

返回的也只是此单例类的唯一静态变量。

(五)策略模式

应用场景:定义算法族,封装起来,使他们之间可以相互替换。

优势:使算法的变化独立于使用算法的用户

敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。

实例:排序算法,NSArray的sortedArrayUsingSelector;经典的鸭子会叫,会飞案例。

注意事项:1,剥离类中易于变化的行为,通过组合的方式嵌入抽象基类

2,变化的行为抽象基类为,所有可变变化的父类

3,用户类的最终实例,通过注入行为实例的方式,设定易变行为

防止了继承行为方式,导致无关行为污染子类。完成了策略封装和可替换性。

(六)工厂模式

应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。

优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。

敏捷原则:DIP依赖倒置原则

实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换

注意事项:项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式,因为其劣势也很明显,

增加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥用。

229.数据持久化存储方案有哪些?

//同223题

230.网络通信用过哪些方式?

1、使用socket的方式进行通信。

2、使用asynsocket类库进行通信。

231.现有100个数字的乱序数组,请用一种方法将它排序.只需写出过程就行.如果乱序数组里的元素增加到10000个,请再次将它排序.

答:

int n = array.Length;

for (int i = 0; i < n - 1; i++){

for (int j = 0 ; j > n - i - 1; j++){

if (array[j] > array[j + 1]) {

int temp = array[j ];

array[j] = array[j + 1];

array[j + 1] = temp;

}

}

}

232.用你擅长的语言,写出获取当前系统时间的代码。

答:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]];

[formatter setDateFormat:@"yy-MM-dd HH:mm"];

NSString *currentTime = [formatter stringFromDate:[NSDate date]];

NSLog(@"%@",currentTime);

233.请描述下“极客帮SOHO”是如何替程序员赚到钱的。

答:

极客邦SOHO是独立程序员兼职任务协同平台,专业服务程序员,IT技术的兼职,众包服务,交易服务,兼职服务,帮助程序员赚钱looip.cncoding.net,外快。

234.写一个标准的宏MIN,这个宏输入两个参数并返回较小的一个.

#define MIN(X,Y)((X)>(Y)?(Y):(X))

235.Obj-c有多重继承吗?不是的话有什么替代方法?

答:

cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的。你不用去考虑繁琐的多继承,虚基类的概念。多态特性在obj-c中通过委托来实现。

236.Static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答:

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

237.MVC模式的理解

答:

MVC,全称Model(模型)-View(视图)-Controller(控制器),这是一种开发模式,他的好处是可以将界面和业务逻辑分离。

Model(模型),是程序的主体部分,主要包含业务数据和业务逻辑。在模型层,还会涉及到用户发布的服务,在服务中会根据不同的业务需求,更新业务模型中的数据。

View(视图),是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在View视图层输入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理。

Controller(控制器),Controller是用来处理用户输入数据,已经更新业务模型的部分。控制器中接收了用户与界面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态。

238.用变量a给出下面的定义

a)一个整型数(An integer)

b)一个指向整型数的指针(A pointer to an integer)

c)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d)一个有10个整型数的数组(An array of 10 integers)

e)一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer)

答案:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int);

// A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int);

// An array of 10 pointers to functions that take an integer argument and return an integer

301、在一个数组中存在一万条以上的字符串,现在要对数组中所有字符串进行拼接操作,请写出拼接方法(要考虑到性能及内存占用情况,ARC模式)。

NSString *string = [arraycomponentsJoinedByString:@","];

302、请举例说明代理和通知两种方式分别适合在什么情况下使用?

代理:一般控件用的比较多,其实也可以用block实现,如果实现的接口比较多的话,建议用代理,如UITableview。

通知:这东西是全局的,而且是同步的,如果你要全局发送消息,并且做的事情时间不长,不会阻塞线程的话,建议使用。

303、是否使用过SQLite或者FMDataBase对数据库进行操作,并试述对事务概念的理解。

FMDatabase是IOS中Sqlite数据库操作类

304、以下两种GCD队列创建有什么不同?

dispatch_queue_t queue = dispatch_queue_create("MyQueue",DISPATCH_QUEUE_SERIAL);

dispatch_queue_t queue =dispatch_queue_create(@“MyQueue", DISPATCH_QUEUE_CONCURRENT);

//生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程执行。第一个参数是队列的名称,在调试程序时会非常有用,所有尽量不要重名了。

//生成一个并发执行队列,block被分发到多个线程去执行

305、运行以下代码会打印什么结果?为什么?

dispatch_queue_t queue =dispatch_queue_create("MyQueue", DISPATCH_QUEUE_SERIAL);

dispatch_apply(3, queue, ^(size_t i) {

NSLog(@"apply loop:%zu", i);

dispatch_apply(3, queue, ^(size_t j) {

NSLog(@"apply loop inside:%zu", j);

});

});

apply loop:0

306、简单说明你对block的理解以及使用block有什么好处。

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

好处: Blocks更清晰。比如一个viewController中有多个弹窗事件,Delegate就得对每个事件进行判断识别来源。而Blocks就可以在创建事件的时候区分开来了。这也是为什么现在苹果API中越来越多地使用Blocks而不是Delegate。

307、setValue:forKey和setObject:forKey的区别是什么?

答: 1, setObject:forkey:中value是不能够为nil的,不然会报错。

setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法

2, setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型

308、try-catch-finally的作用和使用方法。

Java:

1,一个方法内可以有多个try…catch…finally语句块,还可以彼此嵌套,比如下面这个方法:

2,如果一个有返回值的方法内有多个try…catch…finally语句块,return语句要么写在任意一个try…catch内,要么写在方法的最后,否则编译无法通过,如果return语句写在方法的最后,那么以上try…catch…finally语句中的每一个finally块内的代码都将会执行;

3,无论方法内是否发生异常(jvm可以处理的异常),finally块内的代码都将会执行。

309、请写出同步网络请求和异步网络请求函数。

答:首先在ios模拟器上创建一个text窗口(我起名叫tongbu):

//同步网络请求函数

//获取名叫tongbu文本框的内容

NSString *txt=self.tongbu.text;

//创建url对象

NSURL *url=[NSURLURLWithString:txt];

//创建请求对象

NSURLRequest*req=[NSURLRequest requestWithURL:url];

//发起同步,赶回数据给data

NSData*data=[NSURLConnection sendSynchronousRequest:req returningResponse:nilerror:nil];

//异步网络请求

在ViewController.m文件上的- (void)viewDidLoad方法里

NSString*txt2=self.tongbu.text;

//创建url对象

NSURL *url2=[NSURLURLWithString:txt2];

//创建请求对象

NSURLRequest*req2=[NSURLRequest requestWithURL:url2];

//发送请求并建立一个代理

[NSURLConnectionconnectionWithRequest:req2 delegate:self];

//因为代理人是自己所以让自己遵守协议

协议在ViewController.h文件里

@interface ViewController :

UIViewController//因为代理对象是对象所以让自己遵守协议

//同时创建一个NSMutableData类型的对象来接从网络上接收的数据,同时创建3个协议方法来进行接收数据

@property(retain,nonatomic)NSMutableData*data;

//协议方法

//1连接接收响应,表示成功建立连接

-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response{

self.data=[[NSMutableData alloc]init];//创建代理对象,并初始化数据

}

//2连接接收数据

//形参(NSData *)表示接收到的数据

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data{

[self.data

appendData:data];//向data反复添加数据

}

//3连接成功

-(void)connectionDidFinishLoading:(NSURLConnection*)connection{

NSLog(@"连接成功");

}

310、从用户体验角度举例说明同步和异步。

答:1.同步意为着线程阻塞,在主线程中使用此方法会不响应任何用户事件。所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替。

2.异步请求的好处是不阻塞当前线程,但相对于同步请求略为复杂,至少要添加两个回调方法来获取异步事件

答:从用户的体验来说,异步请求数据的APP比同步请求的APP操作更加流畅,快捷,

312、声明NSString类型的属性时,用copy和strong的区别是什么?

copy修饰的NSString,在初始化时,如果来源是NSMutableString的话,会对来源进行一次深拷贝,将来源的内存地址复制一份,这样,两个对象就一点关系就没有了,无论你怎么操作来源,都不会对自己的NSString有任何影响

313、谈谈Object-C的内存管理方式及过程?

从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候,比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变成了1(我们把这个过程叫做alloc)然后程序B也需要使用这个内存,那么计数器就从1变成了2(我们把这个过程叫做retain)紧接着程序A不再需要这段内存了,那么程序A就把这个计数器减1(我们把这个过程叫做release)程序B也不再需要这段内存的时候,那么也把计数器减1(这个过程还是release)当系统(也就是Foundation)发现这个计数器变成了0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)

314、static全局变量与普通的全局变量有什么区别?static普通函数有什么区别?

全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。static函数与普通函数有什么区别?只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在

当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。

315、Objective-C堆和栈的区别?

答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

申请大小:

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出

分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

316、__block和__weak修饰符的区别是什么?

答:1,在MRC时代,__block修饰,可以避免循环引用;ARC时代,__block修饰,同样会引起循环引用问题;

2,__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型;

3,__weak只能在ARC模式下使用,也只能修饰对象,不能修饰基本数据类型;

4,__block对象可以在block中被重新赋值,__weak不可以;

317、如何解决TableView卡顿的问题?

1.答:使用不透明视图。

2.不要重复创建不必要的table

cell。

3.减少视图的数目。

4.不要做多余的绘制工作。

5.预渲染图像。

6.不要阻塞主线程。当然,在不需要响应用户请求时,也可以增加下载线程数,以加快下载速度:

318、简要说下Http通信协议的原理,与Socket协议的区别有哪些?

答:HTTP协议:简单对象访问协议,对应于应用层,HTTP协议是基于TCP连接的

tcp协议:对应于传输层

ip协议:对应于网络层

TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。

Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,才能使用TCP/IP协议。

http连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;

socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。

319、MVC是什么?有什么特性?你还熟悉哪些设计模式,请简要说明。

他们有重复的

320、autorelease和垃圾回收机制(gc)有什么关系?

答:autorelease只是延迟释放,gc是每隔一段时间询问程序,看是否有无指针指向的对象,若有,就将它回收。他们两者没有什么关系。

321、假设类名为MyManager的类有以下单例方法,请写出单例方法的实现:+(MyManager *)sharedManager;

答:+ (MyManager*)sharedManager

{

static MyManager *sharedMyManagerInstance = nil;

static dispatch_once_t predicate;

dispatch_once(&predicate, ^{

sharedMyManagerInstance =[[self alloc] init];

});

return sharedMyManagerInstance;

}

322、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

答:可以.在不适用static或者const(隐式static)情况下,变量的定义只能出现一次,否则会导致重复定义。但却可以声明多次。因此全局变量不可以定义在头文件中。因为当该头文件被多个c文件包含的话,会导致重复定义。因此一般做法是在某个特定的头文件中声明,而在另外一个特定的c文件中定义。需要使用就包含前者。

323、TCP/IP通信建立的过程怎样,端口有什么作用?

答:发出将建立通信会话的第一个数据包之前,发送方主机上的TCP/IP协议执行以下四个不同的步骤:

1.TCP/IP将主机名或NetBIOS名称解析为IP地址。

2.使用目标IP地址和IP路由表,TCP/IP确定要使用的接口和下一跃点IP地址。

3.对于共享访问技术(例如,以太网、令牌环和分布式光纤数据接口(FDDI))上的单播IP流量,地址解析协议(ARP)将下一跃点IP地址解析为媒体访问控制(MAC)地址(也称为数据链接层地址)。

对于以太网和FDDI上的多播IP流量,目标多播IP地址会被映射到相应的多播MAC地址。对于令牌环上的多播IP流量,使用功能地址0xC0-00-00-04-00-00。对于共享访问技术上的广播流量,MAC地址会被映射到0xFF-FF-FF-FF-FF-FF。4.之后,IP数据报会被发送到通过ARP解析的MAC地址、多播映射或MAC级广播地址。

网络访问要通过不同的协议进行,各种协议要通过不同的端口进行访问,如25端口是邮件端口,3389超级终端(就是木马程序最想打开的端口),8000=腾讯OICQ服务器端等等很多很多,记住常用的几个就可以了。

端口:说白了就相当于门,每个门都对应着相对的TCP/IP

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 转:http://www.cocoachina.com/programmer/20151019/13746.htm...
    Style_伟阅读 1,299评论 0 3
  • 注:此文章来源:Job_Yang 的简书 1. Object-c的类可以多重继承么?可以实现多个接口么?Categ...
    广益散人阅读 1,346评论 0 13
  • 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家。(题...
    Job_Yang阅读 12,103评论 12 143
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,966评论 0 7
  • 如果说JOY DIVISION做的是卡夫卡式的音乐,阴郁、晦涩,充满了扭曲无力和失焦感,散发着神秘的哥特气息,那么...
    多啦阿蒙阅读 2,901评论 0 1