iOS 面试题

来源:互联网 发布:linux 递归授权 编辑:程序博客网 时间:2024/06/14 04:02

NOTES

1

@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。

  大概就是如果线程A访问一对象时,线程B必须等线程A访问完毕后,线程B才能够去操作。@synchronized(id anObject)是最简单的方法,会自动对参数对象加锁,保证临界区内的代码线程安全。


2、

Profile-> Instruments



3

设计模式:并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。面向对象编程中,java已经归纳了23种设计模式。

mvc设计模式:模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。 Iphone本身的设计思想就是遵循mvc设计模式。其不属于23种设计模式范畴。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到广泛应用.

单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplication sharedApplication];任何地方调用都可以得到 UIApplication的对象,这个对象是全局唯一的。

观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。

工厂模式:

public?class?Factory{

public?static?Sample?creator(int?which){

if?(which==1)

return?new?SampleA();

else?if?(which==2)

return?new?SampleB();

}

}



4

类别和类扩展的区别。

答:categoryextensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。

extensions可以认为是一个私有的Category



5、

什么是KVOKVC?

答:KVC:值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。

很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。

KVO:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。

具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。

比如我自定义的一个button

[self?addObserver:self?forKeyPath:@"highlighted"?options:0?context:nil];

#pragma?mark?KVO

-?(void)observeValueForKeyPath:(NSString?*)keyPath?ofObject:(id)object?change:(NSDictionary?*)change?context:(void?*)context

{

if?([keyPath?isEqualToString:@"highlighted"]?)?{

[self?setNeedsDisplay];

}

}

对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。

对于kvc机制如何通过key寻找到value

当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

(cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)

设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。

来至cocoa,这个说法应该挺有道理。

因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,

可以按照kvc查找的逻辑理解,就说的过去了。


6、

关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用

答:

const 意味着"只读",下面的声明都是什么意思?

const?int?a;

int?const?a;

const?int?*a;

int?*?const?a;

int?const?*?a?const;

前两个的作用是一样,a是一个常整型数。

第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。

最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

结论:

关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。

如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的) ?通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

1).欲阻止一个变量被改变,可以使用 const关键字。在定义该 const 变量时,通常需要对它进行初

始化,因为以后就没有机会再去改变它了;

2).对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指

定为 const

3).在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

4).对于类的成员函数,若指定其为 const类型,则表明其是一个常函数,不能修改类的成员变量;

5).对于类的成员函数,有时候必须指定其返回值为 const类型,以使得其返回值不为左值



7、

请简要说明viewDidLoadviewDidUnload何时调用

答:viewDidLoadviewnib文件初始化时调用,loadViewcontrollerviewnil时调用。此方法在编程实现view时调用,view控制器默认会注册memory warning notification,当view controller的任何view没有用的时候,viewDidUnload会被调用,在这里实现将retainview release,如果是retainIBOutlet view属性则不要在这里releaseIBOutlet会负责release



8、

简述内存分区情况

答:

1).代码区:存放函数二进制代码

2).数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量

3).堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放

4).栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数



9、

UIViewCLayer有什么区别?

答:

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或仿射变换,可以分别设置层的 transformaffineTransform属性。

9).变形: Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。 CATransform3D的一套方法提供了一些魔术般的变换效果。



10、

ios 平台怎么做数据的持久化?coredatasqlite有无必然联系?coredata是一个关系型数据库吗?

答:iOS 中可以有四种持久化数据的方式:属性列表(plist)、对象归档、 SQLite3 Core Data core data可以使你以图形界面的方式快速的定义 app的数据模型,同时在你的代码中容易获取到它。 coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在 app中继续创建新的任务。在使用 core data的时候,你不用安装额外的数据库系统,因为 core data使用内置的 sqlite 数据库。 core data 将你 app的模型层放入到一组定义在内存中的数据对象。 coredata会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当 core data在对你 app 数据的改变进行保存的时候, core data会把这些数据归档,并永久性保存。 mac os xsqlite 库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用, sqlite是一个轻量级的嵌入式 sql 数据库编程。与 core data 框架不同的是, sqlite 是使用程序式的, sql的主要的 API 来直接操作数据表。 Core Data不是一个关系型数据库,也不是关系型数据库管理系统 (RDBMS)。虽然 Core Dta 支持SQLite 作为一种存储类型,但它不能使用任意的 SQLite数据库。 Core Data 在使用的过程种自己创建这个数据库。 Core Data支持对一、对多的关系。


0 0
原创粉丝点击