100道iOS面试题

面试题:html

1__weak何时用java

想要在block内部变外部变量须要加__weak或者__blockios

2.是否使用过coreImage和coreText?若是使用过,说说你的体验(答案在另外一份)c++

3.什么是IP,HTTP,TCP、UDP等协议?他们分别属于第几层?git

IP属于网络层(第三层);TCP和UDP都属于传输层(第四层);HTTP属于应用层(第七层)。程序员

IP协议保证计算机发送和接收分组数据,负责将消息从一个主机传送到另外一个主机。github

HTTP协议是超文本传输协议,规定客户端和服务器之间的数据传输格式,让客户端和服务器能有效进行数据沟通。web

HTTP的完整通讯过程:请求和响应。HTTP协议规定,客户端向服务器请求内容必须包含请求行,请求头,请求体;服务器向客户端返回数据包含状态行,响应头,响应体内容。面试

客户端向服务器发送HTTP请求的方案有4种,经过NSURLConnection;NSURLSession(不太会);CFNetwork;第三方框架ASI,AFN。算法

(1)NSURLConnection:

使用NSURLConnection发送GET请求步骤:1建立NSURL对象,设置请求路径;

2传入NSURL建立一个NSURLRequest对象;3使用NSURLConnection发送NSURLRequest;4发送异步请求(block回调,代理)

使用NSURLConnection发送POST请求步骤:1建立NSURL对象,设置请求路径;

2传入NSURL建立一个NSURLRequest对象;3使用NSURLConnection发送NSURLRequest;4设置请求体 5发送异步请求(block回调,代理)

(3)CFNetwork:

使用CFNetwork实现TCP协议的通讯,CFNetwork使用CFSocket表明两端的通讯接口,经过CFStream读写数据。

使用CFSocket实现TCP服务器端还有客户端。步骤:

须要建立一个监听socket链接的CFSocket,为kCFSocketAcceptCallBack事件绑定一个回调函数,调用CFSocketSetAddress()函数,将CFSocket绑定到本地的IP地址和端口号,CFSocket做为source添加到线程的CFRunloop上,运行。

(4)AFNetworking:

》使用AFN实现网络通讯。

》提交get和post请求。

1建立AFHTTPReequestOperationManager对象;

2为对象指定解析器

3发送get请求或post请求

4在success参数处理服务器响应成功的正确数据;在failure处理错误数据。

》使用AFN上传文件

简单调用post请求就能够了。

》使用AFN能够处理JSON/plist/XML响应

ASI:使用ASIHTTPRequest实现网络编程

处理同步异步请求发送get请求:步骤1建立ASIHTTPRequest对象;获取服务器响

TCP,UDP的区别: 

TCP---传输控制协议,提供的是面向链接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间创建一个TCP链接,以后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。 

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。因为UDP在传输数据报前不用在客户和服务器之间创建一个链接,且没有超时重发等机制,故而传输速度很快

4.什么是OpenGL?具体使用

OpenGL即是“开放的图形程序接口”。

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

#define SECONDS_PER_YEAR(60*60*24*365)UL

6.写一个委托的 interface

@protocolMyDelegate;

@interfaceMyClass:NSObject

{

 Id<MyDelegate>delegate;

}

7.写一个NSString类的实现

+ (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

+ (id) stringWithCString: (c*****t char*)nullTerminatedCString  

            encoding: (NSStringEncoding)encoding

{

  NSString  *obj;

  obj = [self allocWithZone: NSDefaultMallocZone()];

  obj = [obj initWithCString: nullTerminatedCString encoding: encoding];

  return AUTORELEASE(obj);

}

8.为何标准头文件都有相似如下的结构?  

   #ifndef __INCvxWorksh  

   #define __INCvxWorksh  

   #ifdef __cplusplus  

   extern "C" {  

   #endif  

   /*...*/  

   #ifdef __cplusplus  

   }  

   #endif  

   #endif /* __INCvxWorksh */ 

第一,防止重复包含头文件;

第二点:以下: 

 这样作是为了C++程序要调用已经被编译后的C函数!! 

9.列举几种进程的同步机制,并比较其优缺点

原子操做、信号量机制、自旋锁、管程、会合、分布式系统。

进程之间通讯的途径:共享存储系统消息传递系统管道:以文件系统为基础 


进程死锁的缘由:资源竞争及进程推动顺序非法 


死锁的4个必要条件:互斥、请求保持、不可剥夺、环路 


死锁的处理:鸵鸟策略、预防策略、避免策略、检测与解除死锁

10.什么是键-值,键路径是什么模型的性质是经过一个简单的键(一般是个字符串)来指定的。视图和控制器经过键来查找相应的属性值。在一个给定的实体中,同一个属性的全部值具备相同的数据类型。键-值编码KVC技术用于进行这样的查找—它是一种间接访问对象属性的机制。键路径是一个由用点做分隔符的键组成的字符串,用于指定一个链接在一块儿的对象性质序列。第一个键的
性质是由先前的性质决定的,接下来每一个键的值也是相对于其前面的性质。键路径使您能够以独立于模型
实现的方式指定相关对象的性质。经过键路径,您能够指定对象图中的一个任意深度的路径,使其指向相
关对象的特定属性。

11.c和o.bj-c如何混用1)obj-c的编译器处理后缀为m的文件时,能够识别obj-c和c的代码, 处理mm文件能够识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,并且cpp文件include的头文件中,也不能出现obj- c的代码,由于cpp只是cpp


2) 在mm文件中混用cpp直接使用便可,因此obj-c混cpp不是问题


3)在cpp中混用obj- c其实就是使用obj-c编写的模块是咱们想要的。
若是模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可使用obj-c的东西,能够import,只是后缀是mm。
若是模块以函数实现,那么头文件要按 c的格式声明函数,实现文件中,c++函数内部能够用obj-c,但后缀仍是mm或m。

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

12.objc优势和objc缺点?objc优势:
  1) Cateogies 
  2) Posing 
  3) 动态识别
  4) 指标计算 
  5)弹性讯息传递
  6) 不是一个过分复杂的C衍生语言
  7)Objective-C与 C++ 可混合编程
  缺点: 
  1) 不支援命名空間 
  2)  不支持运算符重载  3) 不支持多重继承4) 使用动态运行时类型,全部的方法都是函数调用,因此不少编译时优化方法都用不到,性能低劣。

13sprintf,strcpy,memcpy使用上有什么要注意的地方

strcpy是⼀个字符串拷⻉的函数,它的函数原型为strcpy(char *dst, c*****t char *src);长度是咱们不可控制的
memcpy,这是⼀个内存拷⻉函数,它的函数原型为memcpy(char *dst, c*****t char* src, unsigned int len);将⻓度为len的⼀段内存,从src拷⻉到dst中去,这个函数的⻓度可控可是会有内存叠加的问题;
sprintf是格式化函数。将⼀段数据经过特定的格式,格式化到⼀个字符串缓冲区中去。

14.静态连接库?静态连接库就是你使用的.lib文件,库中得代码最后须要链接到你的可执行文件中去,因此静态链接的可执行文件通常比较大一些。 (1)引用:格式如:#pragma comment(lib,"XXX.lib")(2)针对开发环境:1》若是使用VC,能够在Project Setting-->Link中加入你的静态库,也能够直接把该.lib文件加入到你的工程中 2》若是使用Visual Studio,位置在 项目→配置属性→链接器→输入→附加依赖项 中加入.lib文件。静态连接库不一样于动态连接库(*.dll),在静态库状况下,函数和数据被编译进一个二进制文件(一般扩展名为*.LIB),Visual C++的编译器在连接过程当中将从静态库中恢复这些函数和数据并把他们和应用程序中的其余模块组合在一块儿生成可执行文件。这个过程称为"静态连接",此时由于应用程序所需的所有内容都是从库中复制了出来,因此静态库自己并不须要与可执行文件一块儿发行。

15.动态连接库?DLL 是一个包含可由多个程序同时使用的代码和数据的库。例如,在 Windows 操做系统中,Comdlg32 DLL 执行与对话框有关的常见函数。所以,每一个程序均可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。 经过使用 DLL,程序能够实现模块化,由相对独立的组件组成。例如,一个计账程序能够按模块来销售。能够在运行时将各个模块加载到主程序中(若是安装了相应模块)。由于模块是彼此独立的,因此程序的加载速度更快,并且模块只在相应的功能被请求时才加载。 此外,能够更为容易地将更新应用于各个模块,而不会影响该程序的其余部分。例如,您可能具备一个工资计算程序,而税率每一年都会更改。当这些更改被隔离到 DLL 中之后,您无需从新生成或安装整个程序就能够应用更新

16.静态连接库和动态连接库的优缺点?

静态连接库的优势:(1) 代码装载速度快,执行速度略比动态连接库快;  (2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。 

2 动态连接库的优势:(1) 更加节省内存并减小页面交换;(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件形成任何影响,于是极大地提升了可维护性和可扩展性;(3) 不一样编程语言编写的程序只要按照函数调用约定就能够调用同一个DLL函数(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不一样开发者和开发组织之间进行开发和测试。

3 不足之处:(1) 使用静态连接生成的可执行文件体积较大,包含相同的公共代码,形成浪费;(2) 使用动态连接库的应用程序不是自完备的,它依赖的DLL模块也要存在,若是使用载入时动态连接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态连接,系统不会终止,但因为DLL中的导出函数不可用,程序会加载失败;速度比静态连接慢。当某个模块更新后,若是新模块与旧的模块不兼容,那么那些须要该模块才能运行的软件,通通撕掉。这在早期Windows中很常见。

17.ffmpeg(FFMpeg)框架是一个集录转音视频编码解码功能为一体的完整的开源解决方案。

18.fmdb(FMDB)框架操做数据库的第三方框架。对sqlite的数据封装

下载地址:https://github.com/ccgus/fmdb

19.320框架(three20框架) Three20 UI 是一个iPhone开发图形接口类的集合,包含图片查看,通常工具,HTTP本地缓存。Three20是来自于Facebook的iPhone程序源代码的

20.什么是沙箱模型?哪些操做是属于私有api范畴?直接发送短信,访问沙箱以外的磁盘文件。

沙箱模型有4个文件夹:documentstmp,app,Library

手动保存的文件在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 = [paths objectAtIndex:0];

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

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

 NSString *cachesDir = [paths objectAtIndex:0];

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

NSString *tmpDir = NSTemporaryDirectory();

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

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

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

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

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

文件IO写入

1,将数据写到Documents目录:

- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {

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

NSString *docDir = [paths objectAtIndex:0];

if (!docDir) {

 

    NSLog(@”Documents directory not found!”); return NO;

 }

NSString *filePath = [docDir stringByAppendingPathComponent:fileName];

    return [data writeToFile:filePath atomically:YES];

}

2,从Documents目录读取数据:

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

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

 

  NSString *docDir = [paths objectAtIndex:0];

 

   NSString *filePath = [docDir stringByAppendingPathComponent:fileName];

 

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

 

   return data;

 

}

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

- (NSString *)dataFilePath {

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

    NSString *documentsDirectory = [paths objectAtIndex:0];

    return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];

 }

NSFileManager* fm=[NSFileManager defaultManager];

 if(![fm fileExistsAtPath:[self dataFilePath]]){

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

[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];

 //取得一个目录下得全部文件名

NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];

//读取某个文件

NSData *data = [fm contentsAtPath:[self dataFilePath]];

 //或者

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

 }

 

21.你在开发项目中时,用到了哪些数据存储方式,iphone中常见的方式有哪些,各有什么区别?plist属性列表(NSArray,NSDictionary),经过XML保存数据,不能保存自定义对象;preference(NSUserDefaults,偏好设置),专门用来保存应用程序的配置信息,数据存储在preference文件夹里面,不能保存普通对象;对象归档(NSCoding,NSKeyedArchiver),实现NSCoding协议,对象序列化,保存自定义对象;SQLite3数据库纯C语言,建立数据库,执行SQL语句对数据进行增删改查;CoteData面向对象框架,经过托管对象上下文NSManagedObjectContext对实体增删改查。

22.线程的常见方法有哪些,你是如何处理多线程的,多线程同步问题你了解么?

NSThread;GCD;NSOperation。线程加锁,休眠,唤醒,解锁,退出。使用@synchronize实现同步,同步锁。

23..init和initwithobject区别(语法)?后者给属性值

 24.你链接服务器用的是什么方法,若是请求过程当中,网络出了问题这么办?

NSURLConnection请求的方法;检测网络状态,监听网络状态改变,发送请求超时。

25.你使用过json解析方式么,他们的底层是如何处理的你了解么?

遍历字符串的字符,最终将格式规定的特殊字符转化为字典去解析

26.xml解析的原理是什么?你还用过其余解析方式吗?DOM( W3C推荐的处理XML解析的规范,对文档CRUD方便,一次性将整个XML文档加载进内存,占用内存大,适合解析小文件)和SAX(从根元素开始,按顺序一个一个元素往下解析,占用内存小,解析速度快,只适合作文档的读取,不适合作文档的CRUD,适合解析大文件)

27.分线程回调主线程方法是什么,有什么做用? 

[obj perforSelectorOnMainThread:]   回到主线程就是刷新界面,UI交互只能在主线程

28.iphone阅读器,若是要读取一个文本文件,请问你是如何处理编码问题的?另外像pdf格式的文件,你如何读取?phone手机阅读器中对于PDF格式的阅读,能够直接用UIWebView控件显示,也能够从网上下载不少直接读取pdf格式的代码,直接从pdf中获得数据。复杂表格动画:

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

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

能够经过xcode的自带工具run---start with performance tool里有instruments下有个leaks工具,启动此工具后,运行项目,工具里能够显示内存泄露的状况,双击可找到源码位置,能够帮助进行内存泄露的处理。

30.你作iphone开发时候,有哪些传值方式,view和view之间是如何传值的?压栈

31.让一个物体从界面中的一点运动到另一点,有哪些方法?

四种方式:1. beginAnimation  2线程 3. NSTimer 4. 图层动画(路径)

32.你了解哪些加密方式?MD5;Base64;循环右移位等

33地图定位CLLocationManager位置管理器, 使用Core Location框架来肯定iphone的位置(GPS,蜂窝基站三角网,wps三种方式)    

MKMapView提供了一套可植入的地图接口,可让咱们在应用中展现地图,并对其进行相关的操做。通常来讲,咱们能够指定一个展现区域,放一些标记在上面,还能够加盖一些层在上面。

MKMapView依赖Google map里面相关服务(如Google Earth API等),因此地图的左下角会有Google字样。

34.图片浏览UIImagePickerController能够从相册,相机,胶卷里得到图片。

35.对象序列化  NSCoding encodeWithcoder  initWithCoder

               NSKeyedUnarchiver   NSKeyedArchiver

36.线程? NSThread

37.各类排序算法?冒泡排序;快速排序;希尔排序

38.通讯底层原理   

OSI七层模型:1物理层  2数据链路层:STP,VT 3网络层:IP 4传输层:tcp,udp  5会话层 6表现层 7应用层:FTP,http

39.在一个对象的方法里面:self.name = “object”;和name =”object”有什么不一样吗?  self.name = "object"会调用对象的setName()方法,会使object引用计数加1,name = "object"会直接把object赋值给当前对象的name 属性,引用计数不增长。

 40.什么是目标-动做机制

目标是动做消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参 见"插座变量"部分)
的形式保有其动做消息的目标。动做是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动做而实现 的方法。程序须要某些机制来进行事件和指令的翻译。这个机制就是目标-动做机制。

41.请列举你熟悉cocoatouch框架(至少三个)

Core Animation

经过 Core Animation,您就能够经过一个基于组合独立图层的简单的编程模型来建立丰富的用户体验。

Core Audio

Core Audio 是播放,处理和录制音频的专业技术,可以轻松为您的应用程序添增强大的音频功能。

Core Data

提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用 或大或小的数据模型。

下面是 Cocoa Touch 中一小部分可用的框架:

• 音频和视频:Core Audio、OpenAL、Media Library、AV Foundation

• 数据管理:Core Data、SQLite

• 图形和动画:Core Animation、OpenGL ES、Quartz 2D

• 网络/li>:Bonjour、WebKit、BSD Sockets

• 用户应用:Address Book、Core Location、Map Kit、Store Kit

42.什么是面向对象?类,对象,成员变量,成员方法

类的定义要实现接口(定义类的成员变量和方法)和实现(引入头文件,实现抽象方法)2个部分;对象定义;建立对象;方法调用;对象和变量。

43.类变量的@protected, @private,@public, @package声明各有什么含义

答:@protected 该类和全部子类中的方法能够直接访问这样的变量。

      @private 该类中的方法能够访问,子类不能够访问。

      @public   能够被全部的类访问

      @package 本包内使用,跨包不能够

44. 一个单例(单件实例)?写Foundation 和 Application Kit 框架中的一些类只容许建立单件对象,即这些类在当前进程中的惟一实例。举例来讲,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,若是该实例还不存在,则首先进行实例的分配 和初始化。 单件对象充当控制中心的角色,负责指引或协调类的各类服务。若是类在概念上只有一个实例(好比
NSWorkspace),就应该产生 一个单件实例,而不是多个实例;若是未来某一天可能有多个实例,您可
以使用单件实例机制,而不是工厂方法或函数。

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

46. main() {  

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));}答案:25 解析: *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5,&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int *ptr=(int *)(&a+1),则ptr实际是&(a[5]),也就是a+5

47.什么叫动态绑定?将调用方法的肯定也推迟到运行时。在编译时,方法的调用并不和代码绑定 在一块儿,只有在消实发送出来以后,才肯定被调用的代码。经过动态类型和动态绑定技术,您的代码每次执行均可以获得不一样的结果。运行时因子负责肯定消息的接 收者和被调用的方法。 运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型肯定了的对象发送消息时,运行环境系统会经过接收者的isa指针定位对象的类,并以此为起点 肯定被调用的方法,方法和消息是动态绑定的。并且,您没必要在Objective-C 代码中作任何工做,就能够自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经肯定的对象时,动态绑定就会例行而 透明地发生。

48. notification是同步仍是异步? kvo是同步仍是异步?notification是全进程空间的通知吗?kvo呢?都是同步。KVO,只要是本身监控的 keyPath属性发生改变,就会当即回调observeValueForKeyPath,其实就是跟内部调用了一个函数是同样的。NSNotification也是如此,在发生postNotificationName的时候,defaultCenter就回去回调相应的observe,也是同步进行的,可能回调的时候须要寻找全部的observes,而后肯定当前,是须要费时a little的。

delegate更不用说了,更是直接回调相应的函数,必须是同步的。

虽然他们都是同步执行的,可是能够在回调的函数里面实现异步操做,上述代码中,对于notification,就异步打印,彻底是能够作到的。

49  NSObject 中description属性的意义,它能够重写吗?能够。

50.  为NSString扩展一个方法,方法能判断字符串是不是Url地址(即判断字符串是否以“http://”),放回BOOL值类型

51. 获取一台设备惟一标示的方法有哪些?  

 1.UDID 

 2.UUID 

 3.MAC ADDRESS  

 4.OPEN UDID   5.广告标识符          

 6.Vindor标示符 

 7.ios7以后用的时keychain(钥匙串)

52.  写一个Objective C中定义及使用委托的例子

53. 定义一个Block并写一个应用例子,若是对变量加上_block的表示,有什么意义。

54.写一个简单的Objective C中的类的继承示例

55.Xcode5.0中的新特性有哪些?自动配置;测试导航器;用于连续集成的Bot;自动布局;资产管理;调式仪表板;Xcode 可视化调试器;源代码控制。

56.发布程序和真机调试的步骤?

发布程序步骤:1登录开发者主页;2生成cer证书;3添加APPID;4生成MobileProvision文件;5导入cer. MobileProvision文件;6填写应用信息;7配置证书;8打包上传程序。真机调试步骤: 1登录开发者主页;2生成cer证书;3添加APPID;4注册真机设备;5生成MobileProvision文件;6导入cer. MobileProvision文件;7替换旧的证书。

57  写一个iphone程序,有2屏,能够经过滑动切换,第二屏有一个webview,读取本地的html文件,Html文件中会加载一个本地xml文件,获取xml文件中的数据内容并显示。(可选:html中加载的js文件)

58.drawRect方法何时调用 当view第一次显示到屏幕上时调用

59.js(javaSclite)和webview如何交互

60.框架phonegap

61.地图中怎么计算两点间的曲线距离

62.定位不许如何优化

63. UIView 和CALayer 有什么区别?二者最大的区别是,图层不会直接渲染到屏幕

64. UITableViewController 中,建立UITableViewCellinitWithSytle:resuseIdentifier 中,reuseIdentifier有什么用?简述UITableViewCell的复用原理.复用队列的元素增长:只有在cell被滑动出界面的时候,此cell才会被加入到复用队列中。每次在建立cell的时候,程序会首先经过调用dequeueReusableCellWithIdentifier:cellType方法,到复用队列中去寻找标示符为“cellType”的cell,若是找不到,返回nil,而后程序去经过调用[[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:cellType] autorelease]来建立标示符为“cellType”的cell。

65. ViewController 的 didReceiveMemoryWarning 是在何时被调用的?UIViewController类中didReceiveMemoryWarning默认的操做是什么?默认调用[super didReceiveMemoryWarning]

66. ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在何时调用的?在自定义ViewController的时候这几个函数里面应该作什么工做?viewDidLoad在view 从nib文件初始化时调用,loadView在controller的view为nil时调用。此方法在编程实现view时调用,view 控制器默认会注册memory warning notification,当view controller的任何view 没有用的时候,viewDidUnload会被调用,在这里实现将retain 的view release,若是是retain的IBOutlet view 属性则不要在这里release,IBOutlet会负责release。

67.ios平台怎么作数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS中能够有4种持久化数据的方式:plist 属性列表、对象归档、SQLite3和Core Data。数据的持久化本质上就是写文件,但从逻辑上又分红不少种,好比写入沙盒(实际上是一个本应用程序才能够访问的路径),好比存到网络上,好比写入数据库。SQLite,它是一个轻量级功能强大的嵌入式关系数据库引擎,也很容易嵌入到应用程序,能够在多个平台使用,与core data框架不一样的是,sqlite是使用程序式,sql的主要API直接操做数据表。Core data与sqlite仍是有联系的,core data 是对sqlite的封装,由于sqlite是c语言的api,然而有人也须要obj-c 的api,因此有了 core data ,另外,core data还提供了一些管理的功能,使用更加方便。

Core Data不是一个关系型数据库,也不是关系型数据库管理系统,虽然Core Dta支持SQLite做为一种存储类型,但它不能使用任意的SQLite数据库。Core Data在使用的过程本身建立数据库,支持对一对多的关系。

68.unix上进程怎么通讯?

 UNIX主要支持三种通讯方式:

1. 基本通讯:主要用来协调进程间的同步和互斥

   (1)锁文件通讯

    通讯的双方经过查找特定目录下特定类型的文件(称锁文件)来完成进程间  对临界资源访问时的互斥;例如进程p1访问一个临界资源,首先查看是否有一个特定类型文件,如有,则等待一段时间再查找锁文件。

   (2)记录锁文件

   2. 管道通讯:适应大批量的数据传递

   3. IPC:适应大批量的数据传递

 

69.UIscrollVew用到了什么设计模式?还能再foundation库中找到相似的吗?

模板(Template)模式,全部datasource和delegate接口都是模板模式的典型应用,

组合模式composition,全部的container view都用了这个模式

观察者模式observer,全部的UIResponder都用了这个模式。

71. 堆和栈的区别

管理方式:对于栈来说,是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放工做由程序员控制,容易产生memory leak。

申请大小:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。堆:堆是向高地址扩展的数据结构,是不连续的内存区域。因而可知,堆得到的空间比较灵活,也比较大。

碎片问题:对于堆来说,频繁的new/delete势必会形成内存空间的不连续,从而形成大量的碎片,使程序效率下降。对于栈来说,则不会存在这个 问题,由于栈是先进后出的队列,他们是如此的一一对应,以致于永远都不可能有一个内存块从栈中间弹出

分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,好比局部变量的分配。动态分配由 alloca函数进行分配,栈的动态分配是由编译器进行释放,无需咱们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

72. 自动释放池是什么,如何工做?

1》 ojc-c 是经过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为1,之后每当碰到有copy,retain,new的时候引用计数都会加1, 每当碰到release和autorelease的时候引用计数就会减1,若是此对象的计数变为0, 就会被系统销毁.
2》 NSAutoreleasePool 就是用来作引用计数的管理工做的,这个东西通常不用你管的.
3. autorelease和release没什么区别,只是引用计数减1的时机不一样而已,autorelease会在对象的使用真正结束的时候才作引用计数减1。

73.  ObjC中,与alloc语义相反的方法是dealloc仍是release?与retain语义相反的方法是dealloc仍是release,为何?须要与alloc配对使用的方法是dealloc仍是release,为何?

retain对应的是release,内存的释放用release。

alloc对应的是dealloc,内存的销毁用dealloc。

74Objective C中的selector 是什么?

你能够理解 @selector()就是类方法的编号,他的行为基本能够等同C语言的中函数指针,只不过C语言中,能够把函数名直接赋给一个函数指针,而Objective-C的类不能直接引用函数指针,这样只能作一个@selector语法来取. 它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)。

75. Objective C中的category是什么?

类别是对一个已经存在的类添加方法(Methods)。你只须要知道这个类的公开接口,不须要知道类的源代码。须要注意的是,类别不能为已存在的类添加实例(成员)变量或扩充方法。

类别最主要的优势是:系统中已经存在的类能够不需修改就可以使用类别的扩展功能。

类别的第二大优势是实现了功能的局部化封装。类别定义能够放在一个已存在的类的定义文件中(.h)。这意味着这个类别只有在类A被引用的前提下才会被外部看到。若是另外一个类不须要用到类A的功能,也就不会看到依附类A存在的类别。

76. 什么是Notification?何时用delegate,何时用Notification?

观察者模式,controller向defaultNotificationCenter添加本身的notification,其余类注册这个notification就能够收到通知,这些类能够在收到通知时作本身的操做(多观察者默认随机顺序发通知给观察者们,并且每一个观察者都要等当前的某个观察者的操做作完才能轮到他来操做,能够用NotificationQueue的方式安排观察者的反应顺序,也能够在添加观察者中设定反映时间,取消观察须要在viewDidUnload 跟dealloc中都要注销)。

delegate针对one-to-one关系,而且reciever能够返回值给sender,notification 能够针对one-to-one/many/none,reciever没法返回值给sender.因此,delegate用于sender但愿接受到reciever的某个功能反馈值,notification用于通知多个object某个事件。

77关键字volatile有什么含意?并给出三个不一样的例⼦:
⼀个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在⽤到这个变量时必须每次都⼩⼼地从新读取这个变量的值,⽽不是使⽤保存在寄存器⾥的备份。下⾯是volatile变量的⼏个例⼦:
• 并⾏设备的硬件寄存器(如:状态寄存器)
• ⼀个中断服务⼦程序中会访问到的⾮⾃动变量(Non-automatic variables)
• 多线程应⽤中被⼏个任务共享的变量

78⼀个参数既能够是const还能够是volatile吗?解释为何。
⼀个指针能够是volatile 吗?解释为何。
下⾯是答案:
• 是的。⼀个例⼦是只读的状态寄存器。它是volatile由于它可能被意想不到地改变。它是const由于程序不该该试图去修改它。
• 是的。尽管这并不很常⻅。⼀个例⼦是当⼀个中服务⼦程序修该⼀个指向⼀个buffer的指针时。

79@synthesize 是系统⾃动⽣成getter和setter属性声明
  @dynamic 是开发者⾃已提供相应的属性声明

80 TCP/UDP区别联系

TCP提供的是面向链接的、可靠的数据流传输,而UDP提供的是非面向链接的、不可靠的数据流传输。简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性通常

81 SOCKET和HTTP通讯的区别
1http是客户端用http协议进行请求,发送请求时候须要封装http请求头,并绑定请求的数据,服务器通常有web服务器配合(固然也非绝对)。 http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开链接,以节省资源。服务器不能主动给客户端响应(除非采起http长链接技术)。iphone主要使用类是NSUrlConnection

2scoket是客户端跟服务器直接使用socket“套接字”进行链接,并无规定链接后断开,因此客户端和服务器能够保持链接通道,双方均可以主动发送数据。通常在游戏开发或股票开发这种要求即时性很强而且保持发送数据量比较大的场合使用。主要使用类是CFSocketRef

3TCP全称是Transmission Control Protocol,中文名为传输控制协议,它能够提供可靠的、面向链接的网络数据传递服务。传输控制协议主要包含下列任务和功能:

确保IP数据报的成功传递。

对程序发送的大块数据进行分段和重组。

确保正确排序及按顺序传递分段的数据。

经过计算校验和,进行传输数据的完整性检查。

82  xib 与nib 本质区别。

 

xib是面向咱们开发人员描述视图的文件。Xib的本质仍是会转换成代码。

 

nib是当程序运行的时候,会将xib转换成nib。

相关文章
相关标签/搜索