最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

IOS经典面试题

IT圈 admin 35浏览 0评论

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时也同样适用。

发布评论

评论列表 (0)

  1. 暂无评论