2024年5月21日发(作者:茅凌青)
IOS面试题
1.在一个对象的方法里面:=“object”;和name=”object”有什么
不同吗?
答:
=”object”:会调用对象的setName()方法;
name=“object”:会直接把object赋值给当前对象的name属性。
2.请简述=nil的机制,以及与[namerelease]的区别?
=nil;//使用nil参数调用setName:方法
[namerelease]生成的访问器将自动释放以前的name对象
3.请简要说明viewDidLoad和viewDidUnload何时调用
答viewDidLoad在view从nib文件初始化时调用,loadView在controller
的view为nil时调用。此方法在编程实现view时调用,view控制器默认会
注册memorywarningnotification,当viewcontroller的任何view没有用的
时候,viewDidUnload会被调用,在这里实现将retain的viewrelease,如果
是retain的IBOutletview属性则不要在这里release,IBOutlet会负责
release。
4.打印结果
main()
{
inta[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是通过一种”referringcounting”(引用计数)的方式来管理内存的,
对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain
的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数
就会减一,如果此对象的计数变为了0,就会被系统销毁.
2)NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不
用你管的.
3)autorelease和release没什么区别,只是引用计数减一的时机不同而
已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
和bounds有什么不同?
答案:
frame指的是:该view在父view坐标系统中的位置和大小。(参照点
是父亲的坐标系统)
是本身坐标系统)
//frame:框架、结构
//bounds:界限
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点
8.队列和栈有什么区别:
答:队列和栈是两种不同的数据容器。从”数据结构”的角度看,它们都是线
性结构,即数据元素之间的关系相同。
队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队
列操作,一端进行出列队操作。
栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈
都在栈顶操作。
协议中,POST和GET的区别是什么?
答案:
1)get是从服务器上获取数据,post是向服务器传送数据。
2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值
和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost
机制,将表单内各个字段与其内容放置在HTMLHEADER内一起传送到
ACTION属性所指的URL地址。用户看不到这个过程。
3)对于get方式,服务器端用tring获取变量的值,对于post
方式,服务器端用获取提交的数据。
4)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般
被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5)get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1)get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post
数据提交方式;
2)在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,
建议用Post方式;
的系统架构分为
(核心操作系统层theCoreOSlayer)、(核心服务层theCoreServices
layer)、(媒体层theMedialayer)和(Cocoa界面服务层theCocoaTouch
layer)四个层次。
与CLayer有什么区别?
答:
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)变形:QuartzCore的渲染能力,使二维图像可以被自由操纵,就好像是
三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。
CATransform3D的一套方法提供了一些魔术般的变换效果。
OS主要提供了几种播放音频的方法?
答:
SystemSoundServices
AVAudioPlayer类
AudioQueueServices
OpenAL
et使用有哪几个步骤(10分)。
答:创建Socket的上下文;创建Socket;配置要访问的服务器信息;封
装服务器信息;连接服务器;
undation中提供了哪几种操作Socket的方法(10分)?
答:CFNetwork、CFSocket和BSDSocket。
15.文件有哪几种方式(10分)?
答:以DOM方式解析XML文件;以SAX方式解析XML文件
Dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom
解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各
节点和xml各标记对应,通过操纵此“树”来处理xml中的文件。xml文
件很大时,建立的“树”也会大,所以会大量占用内存。
Sax解析器占内存少,效率高。
16.线程与进程的区别和联系?
答案:
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用
该基本单元实现系统对应用的并发性。程和线程的主要差别在于它们是不
同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,
在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执
行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,
一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序
健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求
同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata
是一个关系型数据库吗?
iOS中可以有四种持久化数据的方式:属性列表、对象归档、SQLite3和
CoreData;
coredata可以使你以图形界面的方式快速的定义app的数据模型,同
时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功
能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。
在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使
用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在
内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要
做相反的改变,例如用户执行撤销命令。当coredata在对你app数据的
改变进行保存的时候,coredata会把这些数据归档,并永久性保存。
macosx中sqlite库,它是一个轻量级功能强大的关系数据引擎,也
很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌
入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式
的,sql的主要的API来直接操作数据表。CoreData不是一个关系型数
据库,也不是关系型数据库管理系统(RDBMS)。虽然CoreDta支持
SQLite作为一种存储类型,但它不能使用任意的SQLite数据库。Core
Data在使用的过程种自己创建这个数据库。CoreData支持对一、对多的
关系。
的内存管理
如果您通过分配和初始化(比如[[MyClassalloc]init])的方式来创建对
象,您就拥有这个对象,需要负责该对象的释放。这个规则在使用NSObject
的便利方法new时也同样适用。
2024年5月21日发(作者:茅凌青)
IOS面试题
1.在一个对象的方法里面:=“object”;和name=”object”有什么
不同吗?
答:
=”object”:会调用对象的setName()方法;
name=“object”:会直接把object赋值给当前对象的name属性。
2.请简述=nil的机制,以及与[namerelease]的区别?
=nil;//使用nil参数调用setName:方法
[namerelease]生成的访问器将自动释放以前的name对象
3.请简要说明viewDidLoad和viewDidUnload何时调用
答viewDidLoad在view从nib文件初始化时调用,loadView在controller
的view为nil时调用。此方法在编程实现view时调用,view控制器默认会
注册memorywarningnotification,当viewcontroller的任何view没有用的
时候,viewDidUnload会被调用,在这里实现将retain的viewrelease,如果
是retain的IBOutletview属性则不要在这里release,IBOutlet会负责
release。
4.打印结果
main()
{
inta[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是通过一种”referringcounting”(引用计数)的方式来管理内存的,
对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain
的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数
就会减一,如果此对象的计数变为了0,就会被系统销毁.
2)NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不
用你管的.
3)autorelease和release没什么区别,只是引用计数减一的时机不同而
已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
和bounds有什么不同?
答案:
frame指的是:该view在父view坐标系统中的位置和大小。(参照点
是父亲的坐标系统)
是本身坐标系统)
//frame:框架、结构
//bounds:界限
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点
8.队列和栈有什么区别:
答:队列和栈是两种不同的数据容器。从”数据结构”的角度看,它们都是线
性结构,即数据元素之间的关系相同。
队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队
列操作,一端进行出列队操作。
栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈
都在栈顶操作。
协议中,POST和GET的区别是什么?
答案:
1)get是从服务器上获取数据,post是向服务器传送数据。
2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值
和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost
机制,将表单内各个字段与其内容放置在HTMLHEADER内一起传送到
ACTION属性所指的URL地址。用户看不到这个过程。
3)对于get方式,服务器端用tring获取变量的值,对于post
方式,服务器端用获取提交的数据。
4)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般
被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5)get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1)get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post
数据提交方式;
2)在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,
建议用Post方式;
的系统架构分为
(核心操作系统层theCoreOSlayer)、(核心服务层theCoreServices
layer)、(媒体层theMedialayer)和(Cocoa界面服务层theCocoaTouch
layer)四个层次。
与CLayer有什么区别?
答:
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)变形:QuartzCore的渲染能力,使二维图像可以被自由操纵,就好像是
三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。
CATransform3D的一套方法提供了一些魔术般的变换效果。
OS主要提供了几种播放音频的方法?
答:
SystemSoundServices
AVAudioPlayer类
AudioQueueServices
OpenAL
et使用有哪几个步骤(10分)。
答:创建Socket的上下文;创建Socket;配置要访问的服务器信息;封
装服务器信息;连接服务器;
undation中提供了哪几种操作Socket的方法(10分)?
答:CFNetwork、CFSocket和BSDSocket。
15.文件有哪几种方式(10分)?
答:以DOM方式解析XML文件;以SAX方式解析XML文件
Dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom
解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各
节点和xml各标记对应,通过操纵此“树”来处理xml中的文件。xml文
件很大时,建立的“树”也会大,所以会大量占用内存。
Sax解析器占内存少,效率高。
16.线程与进程的区别和联系?
答案:
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用
该基本单元实现系统对应用的并发性。程和线程的主要差别在于它们是不
同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,
在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执
行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,
一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序
健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求
同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata
是一个关系型数据库吗?
iOS中可以有四种持久化数据的方式:属性列表、对象归档、SQLite3和
CoreData;
coredata可以使你以图形界面的方式快速的定义app的数据模型,同
时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功
能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。
在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使
用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在
内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要
做相反的改变,例如用户执行撤销命令。当coredata在对你app数据的
改变进行保存的时候,coredata会把这些数据归档,并永久性保存。
macosx中sqlite库,它是一个轻量级功能强大的关系数据引擎,也
很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌
入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式
的,sql的主要的API来直接操作数据表。CoreData不是一个关系型数
据库,也不是关系型数据库管理系统(RDBMS)。虽然CoreDta支持
SQLite作为一种存储类型,但它不能使用任意的SQLite数据库。Core
Data在使用的过程种自己创建这个数据库。CoreData支持对一、对多的
关系。
的内存管理
如果您通过分配和初始化(比如[[MyClassalloc]init])的方式来创建对
象,您就拥有这个对象,需要负责该对象的释放。这个规则在使用NSObject
的便利方法new时也同样适用。