iOS面试题(2)

1.#import和#include的区别 @class?@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件中还是需要使用#import而#import比起#include的好处就是不会引起交叉编译2. readwrite,readonly,assign,retain,copy,nonatomic 属性的作用@property是 一个属性访问声明,扩号内支持以下几个属性:1,getter=getName,setter=setName,设置setter与 getter的方法名2,readwrite,readonly,设置可供访问级别2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题3,retain,setter方法对参数进行release旧值再retain新值,所有 实现都是这个顺序(CC上有相关资料)4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再 Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。5,nonatomic,非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的…)。3.在一个对象的方法里面:self.name= “object”;和 name =”object” 有什么不同吗?答:self.name =”object”:会调用对象的setName()方法;name = “object”:会直接把object赋值给当前对象的name属性。4.请简述self.name= nil的机制,以及与[namerelease]的区别?self.name =nil;  //使用nil参数调用setName:方法[name release]生成的访问器将自动释放以前的name对象 5.请简要说明viewDidLoad和viewDidUnload何时调用答: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 。6.实例化一个UITableView对象,要求写出关键语句?答:UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];my.delegate = self;my.dataSource = self;首先需要分配空间设置表格类型然后需要设置两个必须的委托对象。7.使用sql语句查询出省名以湖开头,邮编为436001所在的市区?(5分)(表名及字段名自定义)select*fromcitys where postcode=436001 and province=’湖%’;8.打印结果main() {    int a[5]={1,2,3,4,5};    int *ptr=(int *)(&a+1);    printf(“%d,%d”,*(a+1),*(ptr-1));}答:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int)int *ptr=(int *)(&a+1);则ptr实际 是&(a[5]),也就是a+5原因如下:&a是数组指针,其类型为 int (*)[5];而 指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。a是长度为5的int数组指针,所以要加 5*sizeof(int)所以ptr实际是a[5]但是prt与(&a+1)类型是不一样的(这点很重要)所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]. void Func ( char str[100] ) {  sizeof(str ) = ? } void*p = malloc( 100 ); sizeof( p ) = ?这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof( p ) 都为4。 9.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)答:#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。 10.写一” 标准”宏MIN ,这个宏输入两个参数并返回较小的一个答:#define MIN(A,B) ((A) <= (B) ? (A) : (B))这个测试是为下面的目的而设的:标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比 if-then-else 更优化的代码,了解这个用法是很重要的。 懂得在宏中小心地把参数用括号括起来  我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?  least = MIN(*p++, b);结果是:((*p++) <= (b) ? (*p++) :(*p++))这个表达式会产生副作用,指针p会作三次++自增操作。 11.数组和指针的区别(1)数组可以申请在栈区和数据区;指针可以指向任意类型的内存块(2)sizeof作用于数组时,得到的是数组所占的内存大小;作用于指针时,得到的都是4个字节的大小(3)数组名表示数组首地址,值不可以改变,如不可以将++作用于数组名上;普通指针的值可以改变,如可将++作用于指针上(4)用字符串初始化字符数组是将字符串的内容拷贝到字符数组中;用字符串初始化字符指针是将字符串的首地址赋给指针,也就是指针指向了该数组 12.static的作用(1)函数体内static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。 13.简述内存分区情况(1)代码区:存放函数二进制代码(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量(3)堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放(4)栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数 14.#include和#include”filename”有什么区别答:#include直接在库文件目录中搜索所包含的文件;#include”filename”在当前目录下搜索所包含的文件,如果没有的话再到库文件目录搜索。15.const char *p;  charconst*p;  char*const p;  const char* const p;四个修饰指针有什么区别答: (1)定义了一个指向不可变的字符串的字符指针(2)和(1)一样(3)定义了一个指向字符串的指针,该指针值不可改变,即不可改变指向(4)定义了一个指向不可变的字符串的字符指针,且该指针也不可改变指向16.MVC的理解?答:MVC模式考虑三种对象:模型对象、视图对象和控制器对象。 模型对象负责应用程序的数据和定义操作数据的逻辑; 视图对象知道如何显示应用程序的模型数据; 控制器对象是M与V之间的协调者。 17.在Obj-c中有没有私有方法?私有变量?一般采用什么方法实现?objective-c – 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法@interfaceController : NSObject { NSString *something; }+(void)thisIsAStaticMethod;-(void)thisIsAnInstanceMethod;@end@interfaceController (private)-(void)thisIsAPrivateMethod;@end@private可以用来修饰私有变量在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的18.OC中加号方法与减号的区别?加号方法是类方法,属于静态方法减号方法是实例方法必须由类的实例来调用 19.free与release的区别 20.在终端环境下,分别说明4,2,1,0对应的权限是什么21.ARC机制ARC就是automatic reference counting ,简单说就是就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。使用ARC的好处使用ARC有什么好处呢?看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了代码的总量变少了,看上去清爽了不少,也节省了劳动力代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性不好的地方记住一堆新的ARC规则—关键字及特性等需要一定的学习周期一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关 22.自动释放池是什么,如何工作当您向一个对象发送一个autorelease 消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。1. ojc-c 是 通过一种”referring counting”(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.23.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 。24. 浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象深层复制(mutableCopy):复制引用对象本身 意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了 两份独立对象本身。//当修改A时,A copy不变。25. frame和bounds有什么不同?答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)//frame:框架、结构bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)//bounds:界限 26. obj-c的优缺点答案:objc优点:1) Cateogies2) Posing3) 动态识别4) 指标计算5)弹性讯息传递6) 不是一个过度复杂的 C 衍生语言7) Objective-C 与 C++ 可混合编程缺点:1) 不支援命名空间2)  不支持运算符重载3) 不支持多重继承4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。27.  用变量a给出下面的定义  a) 一个整型数(An integer)  b)一个指向整型数的指针( A pointer to aninteger)  c)一个指向指针的的指针,它指向的指针是指向一个整型数( Apointer to a pointer to an intege)r  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) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointer to a function that takes an integer as an argument  andreturns an integer)  h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions t hat takean integer argument and return an integer )  答案是:a) int a; // Anintegerb) int *a; // A pointer to anintegerc) int **a; // A pointer to apointer to an integerd) int a[10]; // An array of10 integerse) int *a[10]; // An array of10 pointers to integersf) int (*a)[10]; // A pointerto an array of 10 integersg) int (*a)(int); // A pointerto a function a that  takes an integer argument and returns anintegerh) int (*a[10])(int); // Anarray of 10 pointers to functions  that take an integer argument andreturn an integer28. 写出几个死循环?29. 队列和栈有什么区别:答:队列和栈是两种不同的数据容器。从”数据结构”的角度看,它们都是线性结构,即数据元素之间的关系相同。队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队列操作,一端进行出列队操作。栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈都在栈顶操作。30.HTTP协议中,POST和GET的区别是什么?答案:1.GET 方法GET 方法提交数据不安全,数据置于请求行,客户端地址栏可见;GET 方法提交的数据大小有限GET 方法不可以设置书签2.POST 方法POST 方法提交数据安全,数据置于消息主体内,客户端不可见POST 方法提交的数据大小没有限制POST 方法可以设置书签31.  iOS的系统架构分为( 核心操作系统层 theCore OS layer )、( 核心服务层theCore Services layer )、( 媒体层 theMedia layer )和( Cocoa 界面服务层 the Cocoa Touch layer )四个层次。32.  控件主要响应3种事件:( 基于触摸的事件 )、( 基于值的事件 )和( 基于编辑的事件 )。33.  xib文件的构成分为哪3个图标?都具有什么功能。(10分)答: File’s Owner 是所有 nib 文件中的每个图标,它表示从磁盘加载 nib 文件的对象;First Responder 就是用户当前正在与之交互的对象;View 显示用户界面;完成用户交互;是 UIView 类或其子类。34.  简述视图控件器的生命周期(10分)。答: loadView 尽管不直接调用该方法,如多手动创建自己的视图,那么应该覆盖这个方法并将它们赋值给试图控制器的 view 属性。viewDidLoad 只有在视图控制器将其视图载入到内存之后才调用该方法,这是执行任何其他初始化操作的入口。viewDidUnload 当试图控制器从内存释放自己的方法的时候调用,用于清楚那些可能已经在试图控制器中创建的对象。viewVillAppear 当试图将要添加到窗口中并且还不可见的时候或者上层视图移出图层后本视图变成顶级视图时调用该方法,用于执行诸如改变视图方向等的操作。实现该方法时确保调用 [super viewWillAppear:].viewDidAppear 当视图添加到窗口中以后或者上层视图移出图层后本视图变成顶级视图时调用,用于放置那些需要在视图显示后执行的代码。确保调用 [super viewDidAppear: ] 。35.  动画有基本类型有哪几种;表视图有哪几种基本样式(10分)?答:动画有两种基本类型:隐式动画和显式动画。36.  实现简单的表格显示需要设置UITableView的什么属性、实现什么协议(10分)?答:实现简单的表格显示需要设置 UITableView 的 dataSource 和 delegate 属性,实现UITableViewDataSource 和 UITableViewDelegate 协议。37.  Cocoa Touch提供了哪几种Core Animation过渡类型(10分)?答: Cocoa Touch 提供了 4 种 Core Animation 过渡类型,分别为:交叉淡化、推挤、显示和覆盖。38.  UIView与CLayer有什么区别(10分)?答: 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 的一套方法提供了一些魔术般的变换效果。39.链表翻转。      40.  链表逆序(C语言)(10分)。链表逆序就是把一个链表按照原来的链接顺序逆序实现(也就是将头变成尾,尾变成头)。编程思路:其实最关键的是先通过原来的链接顺序找到下个节点,然后再把前个节点反序。41. Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用(10分)。答:上下文:主要用于描述图形写入哪里;路径:是在图层上绘制的内容;状态:用于保存配置变换的值、填充和轮廓, alpha 值等。42.  iPhone OS主要提供了几种播放音频的方法(10分)?答: SystemSound ServicesAVAudioPlayer 类Audio Queue ServicesOpenAL43.  使用AVAudioPlayer类调用哪个框架、使用步骤(10分)?答: AVFoundation.framework步骤:配置 AVAudioPlayer 对象;实现 AVAudioPlayer 类的委托方法;控制 AVAudioPlayer 类的对象;监控音量水平;回放进度和拖拽播放。44.  有哪几种手势通知方法、写清楚方法名(10分)?答:-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;45.  实例化一个UITableView对象,要求写出关键语句(10分)。答: UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];my.delegate = self;my.dataSource = self;首先需要分配空间设置表格类型然后需要设置两个必须的委托对象。46.  CFSocket使用有哪几个步骤(10分)。答:创建 Socket 的上下文;创建 Socket ;配置要访问的服务器信息;封装服务器信息;连接服务器;47.  Core Foundation中提供了哪几种操作Socket的方法(10分)?答: CFNetwork 、 CFSocket 和 BSD Socket 。48.  解析XML文件有哪几种方式(10分)?答:以 DOM 方式解析 XML 文件;以 SAX 方式解析 XML 文件;49.  自定义一个委托(15分)。答: @protocol SimpleProtocol-(void)doSomething:(NSString*)str;@end@interfaceSimpleClass:NSObject< SimpleProtocol >{}@end@implementationSimpleClass-(void)doSomething:(NSString *)str{NSLog(str);}@end50.  类别的作用?继承和类别在实现中有何区别?答案: category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。 并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 类别主要有 3 个作用: (1) 将类的实现分散到多个不同文件或多个不同框架中。 (2) 创建对私有方法的前向引用。 (3) 向对象添加非正式协议。 继承可以增加,修改方法,并且可以增加属性。51.通知和协议的不同之处?答案:协议有控制链 (has-a) 的关系,通知没有。 首先我一开始也不太明白,什么叫控制链(专业术语了 ~ )。但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解 简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。 只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理 A 明星要一个发布会,代理人发出处理发布会的消息后,别称 B 的 发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。 因此控制链( has-a 从英语单词大致可以看出,单一拥有和可控制的对应关系。52.关于多态性答案:多态,子类指针可以赋值给父类。 这个题目其实可以出到一切面向对象语言中, 因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。 最重要的是转化成自我理解。53.对于单例的理解答案:基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。 进一步点,考虑下如何在多线程访问单例时的安全性。54.  是否在一个视图控制器中嵌入两个tableview控制器?答案:一个视图控制只提供了一个 View 视图,理论上一个 tableViewController 也不能放吧, 只能说可以嵌入一个 tableview 视图。当然,题目本身也有歧义,如果不是我们定性思维认为的 UIViewController , 而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如 TabbarController 那样的感觉。55. 一个tableView是否可以关联两个不同的数据源?你会怎么处理?答案:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。 因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。 因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?56. Object -c 的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类 好?为什么?答案: Objective-c 只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现, cocoa 中所有的类都是 NSObject 的子类,多继承在这里是用 protocol 委托代理来实现的。57. id 声明的对象有什么特性?答案: id 是个很重要的类型,是个可以指向任何类型的指针或者可以理解为指向任何未知类型的指针。58. 自动释放池跟GC (垃圾回收)有什么区别?iPhone上有GC么?[poolrelease] 和[pooldrain]有什么区别?iPhone 上没有 GC 。 iPhone 开发的时候没有垃圾回收机制。 在垃圾回收环境中,release 是一个空操作。因此, NSAutoreleasePool 提供了 drain 方法,在引用计数环境中,该方法的作用等同于调用 release ,但在垃圾回收环境中,它会触发垃圾回收(如果自上次垃圾回收以来分配的内存大于当前的阈值)。因此,在通常情况下,您应该使用 drain 而不是 release 来销毁自动释放池。59.  线程与进程的区别和联系?答案 : 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 60. ios 平台怎么做数据的持久化?coredata 和sqlite有无必然联系?coredata是一个关系型数据库吗?iOS 中可以有四种持久化数据的方式:属性列表、对象归档、 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 支持对一、对多的关系。61. obj-c 有多重继承么? 如果没有什么替代方法?cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的。你不用去考虑繁琐的多继承,虚基类的概念。62. obj-c 有私有方法么? 私有变量呢?objective-c - 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法@interface Controller : NSObject { NSString *something; }+ (void)thisIsAStaticMethod;- (void)thisIsAnInstanceMethod;@end@interface Controller (private) -(void)thisIsAPrivateMethod;@end @private 可以用来修饰私有变量在Objective‐C 中,所有实例变量默认都是私有的,所有实例方法默认都是公有的63. 假定输入的字符串中只包含字母和* 号。编写函数fun,功能是,除了中间和尾部的*号外,将字符串中其他* 号全部删除。编写时,不用c的其他函数。例:*****A*BC*DEF*G****    结果为:A*BC*DEF*G****void fun (char *a) {int j=0;char *p=a;while (*p==’*')p++;while (*p){a[j++]=*p;p++; }a[j]=0; }64. 截取字符串”20 |http://www.621life.com“ 中 ‘|’字符前面及后面的数据,分别输出它们(10分)。NSString *str = “20|http://www.621life.com”;NSRange range = [strrangeOfString:@"|"];int location = range.location;NSString *str1 = [strsubstringToIndex:location];NSString *str2 = [str substringFromIndex:location+1];65. 获取项目根路径,并在其下创建一个名称为userData 的目录。(10分)。// 获取根路径NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString *documentsDirectory = [paths objectAtIndex:];// 创建文件系统管理器NSFileManager *fileManager = [[NSFileManageralloc] init];// 判断userData 目录是否存在if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {// 不存在, 创建一个userData目录[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];}66. tableView 的重用机制(10 分)?UITableView 通过重用单元格来达到节省内存的目的: 通过为每个单元格指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,允许恢复单元格以便重用.对于不同种类的单元格使用不同的ID,对于简单的表格,一个标识符就够了.67. 这段代码有什么问题吗@implementation Person  i.      (void)setAge:(int)newAge{  self.age = newAge;  }死循环68. 用变量a 给出下面的定义a)    一个整型b)    一个指向整型数的指针c)    一个指向指针的的指针,它指向的指针是指向一个整型数d)    一个有10 个整型数的数组e)    一个有10 个指针的数组,该指针是指向一个整型数的f)    一个指向有10 个整型数数组的指针g)    一个指向函数的指针,该函数有一个整型参数并返回一个整型数h)    一个有10 个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 a)    int a;b)    int *a;c)    int **a;d)    int a[10]e)    int *a[10];f)    int (*a)[10];g)    int (*a)(int);i)    int (*a[10])(int); 69. 给定一个字符串,输出本字符串中只出现一次并且最靠前的那个字符的位置?比如”abaccddeeef” 则是b,输出2 int find(char *_str){char *p = _str;inti = 1;while (*p){char *temp = _str;while (*temp){if ((*p ==*temp)&&(p != temp)){break;}temp++;if (*temp == 0) {returni;}}i++;p++;}return-1;}#include#include#includeintfind_char(constchar* str){staticintpos[256];const unsigned char* p =(const unsigned char*)str;inti = 0;if( (!str) || (!(*str)) )return -1;memset(pos,-1,sizeof(pos));while(*p){if(pos[*p] == -1){pos[*p] = p-(const unsigned char*)str;}else{pos[*p] = -2;}p++;}for(i=0;i=0)returnpos[i];}return -1;}int main(){constchar* p =”abaccddeeef”;intpos = find_char(p);printf(“%d, it is’%c’\n”,pos,pos!=-1?p[pos]:’ ‘);p =”abcdefghijklmnopqrstuvwxyz ““abcdefghijklmnopqrstuwxyz”;pos = find_char(p);printf(“%d, it is’%c’\n”,pos,pos!=-1?p[pos]:’ ‘);return0;}70. objective-c 中的数字对象都有哪些,简述它们与基本数据类型的区别是什么?在OC 中NSNumber是数字对象,可以进行拆装箱操作!// 将int 转为NSNumberNSNumber *num = [NSNumber numberWithInt:123];// 得到一个intinttestNum = [numintValue];71. 用NSLog 函数输出一个浮点类型,结果四舍五入,并保留一位小数NSLog(@”%0.1f”,4.4324);72. objective-c 中的词典对象、可变词典对象是哪个,初始化一个含有两个键值对的可变词典对象,并动态的添加和删除一条记录,输出第一条记录.词典NSDictionary ,可变词典NSMutableDictionary,// 初始化一个可变词典,带有2 个键值对NSMutableDictionary *dic =[NSMutableDictionarydictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];// 添加[dicsetObject:@"value3"forKey:@"key3"];// 删除[dicremoveObjectForKey:@"key3"];// 获取(按key 获取)[dicobjectForKey:@"key1"];73. 获取项目根路径,并在其下创建一个名称为userData 的目录。// 获取根路径NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*documentsDirectory = [paths objectAtIndex:];// 创建文件系统管理器NSFileManager *fileManager= [[NSFileManageralloc] init];// 判断userData 目录是否存在if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {// 不存在, 创建一个userData目录[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];}74. do-while 与 while-do 的区别?do-while 先执行循环体,然后判断条件,如果条件判断为ture ,则继续执行循环体,如果判断为false,则不执行循环体while-do 是先判断条件是否正确,若正确则执行循环体,若不正确则不执行循环体。所以do-while 至少循环一次,而while-do有可能一次也不循环。75. 用C 语言,求2到100内的所有素数和。 #includeintisPrime(int n)            // 求素数,这是最经典的算法代码。建议记住

{

inti;

for(i=2;i*i<=n;i++)

if(n%i==0)

return 0;

return 1;

}

int main()

{

inti,sum=0;

for(i=2;i<100;i++)

if( isPrime(i))

sum+=i;

printf(“%5d”,sum);

return 0 ;

}

intisPrime(int n)

{

inti;

for(i=2;i<=n/2;i++)

{

if(n%i==0)

break;

}

if(i>n/2)

return1;

else

return0;

}

76.单件实例是什么(10分)。

Foundation 和 Application Kit 框架中的一些 类 只允 许创 建 单 件 对 象,即 这 些 类 在当前 进 程中的唯一 实 例。 举 例来 说 ,NSFileManager 和NSWorkspace 类 在使用时 都是基于 进 程 进 行 单 件 对 象的 实 例化。当向 这 些 类请 求 实 例的 时 候,它 们会向您 传递单 一 实 例的一个引用,如果 该实 例 还 不存在, 则 首先 进 行 实 例的分配 和初始化。 单 件 对 象充当控制中心的角色, 负责 指引或 协调类 的各种服 务 。如果 类 在概念上只有一个 实 例(比如

NSWorkspace ),就 应该产 生 一个 单 件 实 例,而不是多个 实 例;如果将来某一天可能有多个 实 例,您可以使用 单 件 实 例机制,而不是工厂方法或函数。

77.自动释放池是什么,如何工作。

当您向一个对象发送一个autorelease 消息时,Cocoa就会将该对象的一个

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,423评论 3 44
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,123评论 29 470
  • #import和#include的区别 @class? @class一般用于头文件中需要声明该类的某个实例变量的时...
    sellse阅读 320评论 0 2
  • 1.#import和#include的区别 @class? @class一般用于头文件中需要声明该类的某个实例变量...
    晚照清舟阅读 394评论 0 0
  • 昨天学到的是好词,今天却是不吉利的Ominous,乍一看有点像Omnipotent(万能的),因为Omni作为词缀...
    FeBird阅读 1,028评论 0 0