11.多线程的优点和缺点分别是什么?
优点:1、将耗时较⻓长的操作(⺴⽹网络请求、图⽚片下载、⾳音频下载、数据库
访问等)放在⼦子线程中执⾏行,可以防⽌止主线程的卡死;2、可以发挥多核
处理的优势,提升cpu的使⽤用率。
缺点:1、每开辟⼀一个⼦子线程就消耗⼀一定的资源; 2、会造成代码的可读
性变差;3、如果出现多个线程同时访问⼀一个资源,会出现资源争夺的情
况
12.C语⾔言中static关键字的具体作⽤用有哪些?
static作⽤用:“改变⽣生命周期” 或者 “改变作⽤用域”。
在C语⾔言中,关键字static的作⽤用:
1)在函数体,局部的static变量。⽣生存期为程序的整个⽣生命周期,(它存
活多⻓长时间);作⽤用域却在函数体内(它在什么地⽅方能被访问(空
间))。 ⼀一个被声明为静态的变量在这⼀一函数被调⽤用过程中维持其值不
变。因为它分配在静态存储区,函数调⽤用结束后并不释放单元,但是在其
它的作⽤用域的⽆无法访问。当再次调⽤用这个函数时,这个局部的静态变量还
存活,⽽而且⽤用在它的访问空间,因此访问到的是上次调⽤用后的值。
2) 在⽂文件模块内(但在函数体外),⼀一个被声明为静态的全局变量可以
被模块内所有函数访问,但不能被模块外其它函数访问。它是⼀一个本地的
全局变量。限制静态全局变量的作⽤用域。
3) 在⽂文件模块内,⼀一个被声明为静态的函数只可被这⼀一模块内的其它函
数调⽤用。那就是,这个函数被限制在声明它的模块的本地范围内使⽤用。函
数默认情况下是全局函数,可以被任意其它⽂文件模块调⽤用。
4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有⼀一份
拷⻉贝;
5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,
因⽽而只能访问类的static 成员变量。
13.iOS系统架构分⼏几层?
iOS的系统架构分为四个层次:核⼼心操作系统层(Core OS layer)、核
⼼心服务层(Core Services layer)、媒体层(Media layer)和可触摸层
(Cocoa Touch layer)
1、Core OS是位于iOS系统架构最下⾯面的⼀一层是核⼼心操作系统层,它包
括内存管理、⽂文件系统、电源管理以及⼀一些其他的操作系统任务。它可以
直接和硬件设备进⾏行交互。作为app开发者不需要与这⼀一层打交道。
2、Core Services是核⼼心服务层,可以通过它来访问iOS的⼀一些服务。
3、Media是媒体层,通过它我们可以在应⽤用程序中使⽤用各种媒体⽂文件,
进⾏行⾳音频与视频的录制,图形的绘制,以及制作基础的动画效果。
4、Cocoa Touch是可触摸层,这⼀一层为我们的应⽤用程序开发提供了各
种有⽤用的框架,并且⼤大部分与⽤用户界⾯面有关,本质上来说它负责⽤用户在iOS
设备上的触摸交互操作。
14.iOS有没有垃圾回收?
没有
OC使⽤用了⼀一种叫做引⽤用计数的机制来管理对象,如果对⼀一个对象使⽤用了
alloc、[Mutable]copy,retain,那么你必须使⽤用相应的realease或者
autorelease。也可以理解为⾃自⼰己⽣生成的对象,⾃自⼰己持有。⾮非⾃自⼰己⽣生成的
对象,⾃自⼰己也能持有。不在需要⾃自⼰己持有的对象时释放。⾮非⾃自⼰己持有的对
象⽆无法释放。⽣生成并持有对象<alloc,new,copy,mutableCopy等>,持
有对象<retain>,释放对象<release>,废弃对象<dealloc>。readwrite(默
认):可读可写,表⽰示既有getter⽅方法,也有setter⽅方法。readonly:表⽰示只
有getter⽅方法,没有setter⽅方法。nonatomic:不考虑线程安全。atomic
(默认):线程操作安全。strong(默认):ARC下和MRC下retain⼀一样,
weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存
释放掉后⾃自动置为nil,防⽌止野指针。
15.请简述内存分区的情况
1)、栈区(stack)— 由编译器⾃自动分配释放 ,存放函数的参数值,局部
变量的值等。其操作⽅方式类似于数据结构中的栈。
2)、堆区(heap) — ⼀一般由程序员分配释放, 若程序员不释放,程序
结束时可能由OS回收 。(ios中alloc都是存放在堆中)
3)、全局区(静态区)(static)—,全局变量和静态变量的存储是放在
⼀一块的,初始化的全局变量和静态变量在⼀一块区域, 未初始化的全局变
量和未初始化的静态变量在相邻的另⼀一块区域。 - 程序结束后由系统释放。
注意:全局区⼜又可分为未初始化全局区:.bss段和初始化全局区:data段。
4)、常量区—常量字符串就是放在这⾥里的。 程序结束后由系统释放
5)、代码区—存放函数体的⼆二进制代码。
编码注意:当⼀一个app启动后,代码区,常量区,全局区⼤大⼩小已固定,因
此指向这些区的指针不会产⽣生崩溃性的错误。⽽而堆区和栈区是时时刻刻变
化的(堆的创建销毁,栈的弹⼊入弹出),所以当使⽤用⼀一个指针指向这两个
区⾥里⾯面的内存时,⼀一定要注意内存是否已经被释放,否则会产⽣生程序崩溃
(编程中很常⻅见)。
代码区存放于低地址,栈区存放于⾼高地址。
16.SDWebimage的原理。
1.显⽰示占位图
2.在内存缓存中查找图⽚片是否已下载,如果已下载回调展⽰示
3.如果内存缓存中没有,⽣生成NSInvocationOperation添加到队列中
去磁盘中查找,如果有添加到内存缓存中并回调展⽰示
4.如果磁盘中没有,⽤用下载器开始下载,下载完成后在磁盘与内存缓存
中同时保存并且回调展⽰示,写⽂文件到硬盘也在以单独
NSInvocationOperation 完成,避免拖慢主线程,
5.SDImageCache 在初始化的时候会注册⼀一些消息通知,在内存警
告或退到后台的时候清理内存图⽚片缓存,应⽤用结束的时候清理过期图⽚片。
实现机制: 代理
底层实现原理: 沙盒缓存机制,主要由(内存图⽚片缓存,内存操作缓存,磁盘沙
盒缓存)
17.什么是类,对象,⼆二者的区别是什么,cocoa中所有对象
的积累是什么?
类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些
数据上的操作封装在⼀一起。
类是对象的抽象,⽽而对象是类的具体实例。类是抽象的,不占⽤用内存,⽽而
对象是具体的,占⽤用存储空间。类是⽤用于创建对象的蓝图,它是⼀一个定义
包括在特定类型的对象中的⽅方法和变量的软件模板。
对象是具有类类型的变量。类和对象是⾯面向对象编程技术中的最基本的概
念。
对象是对客观事物的抽象,类是对对象的抽象。类是⼀一种抽象的数据类型,
它们的关系是,对象是类的实例,类是对象的模板。
1,类是⼀一个抽象的概念,它不存在于现实中的时间/空间⾥里,类只是为所
有的对象定义了抽象的属性与⾏行为。就好像“Person(⼈人)”这个类,
它虽然可以包含很多个体,但它本⾝身不存在于现实世界上。
2,对象是类的⼀一个具体。它是⼀一个实实在在存在的东⻄西。
3,类是⼀一个静态的概念,类本⾝身不携带任何数据。当没有为类创建任何
对象时,类本⾝身不存在于内存空间中。
4,对象是⼀一个动态的概念。每⼀一个对象都存在着有别于其它对象的属于
⾃自⼰己的独特的属性和⾏行为。对象的属性可以随着它⾃自⼰己的⾏行为⽽而发⽣生改变。
cocoa中所有对象的基类是NSObject。
在Object-C中,类的对象执⾏行的操作,是通过给该类或者该类对象发送
消息实现,如:[object func];就是给object对象发送func消息,类
似C++中的⽅方法调⽤用。给object对象发送func消息后,object对象查询
所属类的func⽅方法执⾏行。
18.self.name = nil 和 name = nil 有什么不同
self.name = nil 使⽤用nil参数调⽤用setName:⽅方法。
name=nil 会直接把nil赋值给当前对象的name属性。
19.frame和bounds有什么不同
frame指的是:该view在⽗父view坐标系统中的位置和⼤大⼩小。(参照点是⽗父亲
的坐标系统)
bounds指的是:该view在本⾝身坐标系统中的位置和⼤大⼩小。(参照点是本⾝身
坐标系统)
20.UITextField的代理⽅方法,怎么处理输⼊入⽂文本框被键盘遮挡
(具体代码)
//开始编辑输⼊入框的时候,软键盘出现,执⾏行此事件
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect frame = textField.frame;
int offset = frame.origin.y + 32 - (self.view.frame.size.height -
216.0);//iPhone键盘⾼高度216,iPad的为352
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:0.3f];
//将视图的Y坐标向上移动offset个单位,以使下⾯面腾出地⽅方⽤用于软键盘
的显⽰示
if(offset > 0)
self.view.frame = CGRectMake(0.0f, -offset,
self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}
//当⽤用户按下return键或者按回⻋车键,keyboard消失
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
//输⼊入框编辑完成以后,将视图恢复到原始状态
-(void)textFieldDidEndEditing:(UITextField *)textField
{
self.view.frame =CGRectMake(0, 0, self.view.frame.size.width,
self.view.frame.size.height);
}
优点:1、将耗时较⻓长的操作(⺴⽹网络请求、图⽚片下载、⾳音频下载、数据库
访问等)放在⼦子线程中执⾏行,可以防⽌止主线程的卡死;2、可以发挥多核
处理的优势,提升cpu的使⽤用率。
缺点:1、每开辟⼀一个⼦子线程就消耗⼀一定的资源; 2、会造成代码的可读
性变差;3、如果出现多个线程同时访问⼀一个资源,会出现资源争夺的情
况
12.C语⾔言中static关键字的具体作⽤用有哪些?
static作⽤用:“改变⽣生命周期” 或者 “改变作⽤用域”。
在C语⾔言中,关键字static的作⽤用:
1)在函数体,局部的static变量。⽣生存期为程序的整个⽣生命周期,(它存
活多⻓长时间);作⽤用域却在函数体内(它在什么地⽅方能被访问(空
间))。 ⼀一个被声明为静态的变量在这⼀一函数被调⽤用过程中维持其值不
变。因为它分配在静态存储区,函数调⽤用结束后并不释放单元,但是在其
它的作⽤用域的⽆无法访问。当再次调⽤用这个函数时,这个局部的静态变量还
存活,⽽而且⽤用在它的访问空间,因此访问到的是上次调⽤用后的值。
2) 在⽂文件模块内(但在函数体外),⼀一个被声明为静态的全局变量可以
被模块内所有函数访问,但不能被模块外其它函数访问。它是⼀一个本地的
全局变量。限制静态全局变量的作⽤用域。
3) 在⽂文件模块内,⼀一个被声明为静态的函数只可被这⼀一模块内的其它函
数调⽤用。那就是,这个函数被限制在声明它的模块的本地范围内使⽤用。函
数默认情况下是全局函数,可以被任意其它⽂文件模块调⽤用。
4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有⼀一份
拷⻉贝;
5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,
因⽽而只能访问类的static 成员变量。
13.iOS系统架构分⼏几层?
iOS的系统架构分为四个层次:核⼼心操作系统层(Core OS layer)、核
⼼心服务层(Core Services layer)、媒体层(Media layer)和可触摸层
(Cocoa Touch layer)
1、Core OS是位于iOS系统架构最下⾯面的⼀一层是核⼼心操作系统层,它包
括内存管理、⽂文件系统、电源管理以及⼀一些其他的操作系统任务。它可以
直接和硬件设备进⾏行交互。作为app开发者不需要与这⼀一层打交道。
2、Core Services是核⼼心服务层,可以通过它来访问iOS的⼀一些服务。
3、Media是媒体层,通过它我们可以在应⽤用程序中使⽤用各种媒体⽂文件,
进⾏行⾳音频与视频的录制,图形的绘制,以及制作基础的动画效果。
4、Cocoa Touch是可触摸层,这⼀一层为我们的应⽤用程序开发提供了各
种有⽤用的框架,并且⼤大部分与⽤用户界⾯面有关,本质上来说它负责⽤用户在iOS
设备上的触摸交互操作。
14.iOS有没有垃圾回收?
没有
OC使⽤用了⼀一种叫做引⽤用计数的机制来管理对象,如果对⼀一个对象使⽤用了
alloc、[Mutable]copy,retain,那么你必须使⽤用相应的realease或者
autorelease。也可以理解为⾃自⼰己⽣生成的对象,⾃自⼰己持有。⾮非⾃自⼰己⽣生成的
对象,⾃自⼰己也能持有。不在需要⾃自⼰己持有的对象时释放。⾮非⾃自⼰己持有的对
象⽆无法释放。⽣生成并持有对象<alloc,new,copy,mutableCopy等>,持
有对象<retain>,释放对象<release>,废弃对象<dealloc>。readwrite(默
认):可读可写,表⽰示既有getter⽅方法,也有setter⽅方法。readonly:表⽰示只
有getter⽅方法,没有setter⽅方法。nonatomic:不考虑线程安全。atomic
(默认):线程操作安全。strong(默认):ARC下和MRC下retain⼀一样,
weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存
释放掉后⾃自动置为nil,防⽌止野指针。
15.请简述内存分区的情况
1)、栈区(stack)— 由编译器⾃自动分配释放 ,存放函数的参数值,局部
变量的值等。其操作⽅方式类似于数据结构中的栈。
2)、堆区(heap) — ⼀一般由程序员分配释放, 若程序员不释放,程序
结束时可能由OS回收 。(ios中alloc都是存放在堆中)
3)、全局区(静态区)(static)—,全局变量和静态变量的存储是放在
⼀一块的,初始化的全局变量和静态变量在⼀一块区域, 未初始化的全局变
量和未初始化的静态变量在相邻的另⼀一块区域。 - 程序结束后由系统释放。
注意:全局区⼜又可分为未初始化全局区:.bss段和初始化全局区:data段。
4)、常量区—常量字符串就是放在这⾥里的。 程序结束后由系统释放
5)、代码区—存放函数体的⼆二进制代码。
编码注意:当⼀一个app启动后,代码区,常量区,全局区⼤大⼩小已固定,因
此指向这些区的指针不会产⽣生崩溃性的错误。⽽而堆区和栈区是时时刻刻变
化的(堆的创建销毁,栈的弹⼊入弹出),所以当使⽤用⼀一个指针指向这两个
区⾥里⾯面的内存时,⼀一定要注意内存是否已经被释放,否则会产⽣生程序崩溃
(编程中很常⻅见)。
代码区存放于低地址,栈区存放于⾼高地址。
16.SDWebimage的原理。
1.显⽰示占位图
2.在内存缓存中查找图⽚片是否已下载,如果已下载回调展⽰示
3.如果内存缓存中没有,⽣生成NSInvocationOperation添加到队列中
去磁盘中查找,如果有添加到内存缓存中并回调展⽰示
4.如果磁盘中没有,⽤用下载器开始下载,下载完成后在磁盘与内存缓存
中同时保存并且回调展⽰示,写⽂文件到硬盘也在以单独
NSInvocationOperation 完成,避免拖慢主线程,
5.SDImageCache 在初始化的时候会注册⼀一些消息通知,在内存警
告或退到后台的时候清理内存图⽚片缓存,应⽤用结束的时候清理过期图⽚片。
实现机制: 代理
底层实现原理: 沙盒缓存机制,主要由(内存图⽚片缓存,内存操作缓存,磁盘沙
盒缓存)
17.什么是类,对象,⼆二者的区别是什么,cocoa中所有对象
的积累是什么?
类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些
数据上的操作封装在⼀一起。
类是对象的抽象,⽽而对象是类的具体实例。类是抽象的,不占⽤用内存,⽽而
对象是具体的,占⽤用存储空间。类是⽤用于创建对象的蓝图,它是⼀一个定义
包括在特定类型的对象中的⽅方法和变量的软件模板。
对象是具有类类型的变量。类和对象是⾯面向对象编程技术中的最基本的概
念。
对象是对客观事物的抽象,类是对对象的抽象。类是⼀一种抽象的数据类型,
它们的关系是,对象是类的实例,类是对象的模板。
1,类是⼀一个抽象的概念,它不存在于现实中的时间/空间⾥里,类只是为所
有的对象定义了抽象的属性与⾏行为。就好像“Person(⼈人)”这个类,
它虽然可以包含很多个体,但它本⾝身不存在于现实世界上。
2,对象是类的⼀一个具体。它是⼀一个实实在在存在的东⻄西。
3,类是⼀一个静态的概念,类本⾝身不携带任何数据。当没有为类创建任何
对象时,类本⾝身不存在于内存空间中。
4,对象是⼀一个动态的概念。每⼀一个对象都存在着有别于其它对象的属于
⾃自⼰己的独特的属性和⾏行为。对象的属性可以随着它⾃自⼰己的⾏行为⽽而发⽣生改变。
cocoa中所有对象的基类是NSObject。
在Object-C中,类的对象执⾏行的操作,是通过给该类或者该类对象发送
消息实现,如:[object func];就是给object对象发送func消息,类
似C++中的⽅方法调⽤用。给object对象发送func消息后,object对象查询
所属类的func⽅方法执⾏行。
18.self.name = nil 和 name = nil 有什么不同
self.name = nil 使⽤用nil参数调⽤用setName:⽅方法。
name=nil 会直接把nil赋值给当前对象的name属性。
19.frame和bounds有什么不同
frame指的是:该view在⽗父view坐标系统中的位置和⼤大⼩小。(参照点是⽗父亲
的坐标系统)
bounds指的是:该view在本⾝身坐标系统中的位置和⼤大⼩小。(参照点是本⾝身
坐标系统)
20.UITextField的代理⽅方法,怎么处理输⼊入⽂文本框被键盘遮挡
(具体代码)
//开始编辑输⼊入框的时候,软键盘出现,执⾏行此事件
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect frame = textField.frame;
int offset = frame.origin.y + 32 - (self.view.frame.size.height -
216.0);//iPhone键盘⾼高度216,iPad的为352
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:0.3f];
//将视图的Y坐标向上移动offset个单位,以使下⾯面腾出地⽅方⽤用于软键盘
的显⽰示
if(offset > 0)
self.view.frame = CGRectMake(0.0f, -offset,
self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}
//当⽤用户按下return键或者按回⻋车键,keyboard消失
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
//输⼊入框编辑完成以后,将视图恢复到原始状态
-(void)textFieldDidEndEditing:(UITextField *)textField
{
self.view.frame =CGRectMake(0, 0, self.view.frame.size.width,
self.view.frame.size.height);
}