IOS面试题
1.在一个对象的方法里面:self.name=“object”;和name=”object”有什么不同吗?
答:
self.name=”object”:会调用对象的setName()方法;
name=“object”:会直接把object赋值给当前对象的name属性。
2.请简述self.name=nil的机制,以及与[namerelease]的区别?
self.name=nil;//使用nil参数调用setName:方法
[name release]生成的访问器将自动释放以前的name对象
3.请简要说明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。
4.打印结果
app开发者需要更新此app以在此ios上正常使用main()
{
int a[5]={1,2,3,4,5};
int*ptr=(int*)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1));
}
答:
*(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].
5.简述内存分区情况
提示:分为代码区、数据区、堆区、栈区
(1)代码区:存放函数二进制代码
(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量
(3)堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
(4)栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数
6.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的
一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
1)objc-c是通过一种”referring counting”(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain 的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.
2)NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.
3)autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
7.frame和bounds有什么不同?
答案:
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)//frame:框架、结构
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)//bounds:界限
8.队列和栈有什么区别:
答:队列和栈是两种不同的数据容器。从”数据结构”的角度看,它们都是线性结构,即数据元素之间的关系相同。
队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队列操作,一端进行出列队操作。
栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈都在栈顶操作。
9.HTTP协议中,POST和GET的区别是什么?
答案:
1)get是从服务器上获取数据,post是向服务器传送数据。
2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post 机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post 方式,服务器端用Request.Form获取提交的数据。
4)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。5)get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1)get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post 数据提交方式;
2)在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
10.iOS的系统架构分为
(核心操作系统层theCore OS layer)、(核心服务层theCore Services layer)、(媒体层theMedia layer)和(Cocoa界面服务层the Cocoa Touch layer)四个层次。
11.UIView与CLayer有什么区别?
答:
1)UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimatio
n来实现的。它真正的绘图部分,是由一个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的一套方法提供了一些魔术般的变换效果。
12.iPhone OS主要提供了几种播放音频的方法?
答:
SystemSound Services
AV AudioPlayer类
Audio Queue Services
OpenAL