1. 简述OC中内存管理机制
oc中的内存管理机制是自动引用计数,它分为两种方式:MRC和ARC,MRC是手动管理内存,ARC是系统自动管理内存;他的原则是谁开辟谁释放,有开辟就要有销毁
2. readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
Readwrite:读写特性,可读可写(是默认属性)
Readonly:只读,只有getter没有setter
Assign:修饰一些基本的数据类型(int char float double)和id类型
Retain:修饰一些计数类型
Copy:一般修饰字符串类型
Nonatomic:非原子性,不需要考虑线程的安全,执行效率高
Atomic:原子性的,优点就是线程是安全的,但是执行的效率低
3. 关于iOS 多线程问题
多线程有三种方式:NSThread、NSOperationQueue、GCD
NSThread:是比较轻量级的线程,需要自己管理线程内地生命周期,线程的同步
NSOperationQueue:是一个操作队列,用来管理Operation对象的执行,会根据需要自动开辟合适数量的线程去执行任务
GCD:是比较常用的一种线程,可以分为三种:主线程队列,并行队列和串行队列
4.提升UITableView性能的几点建议
a.使用懒加载,什么时候使用,什么时候初始化并开辟内存空间,减少内存的占用
b.自定义cell的高度
c.cell的重用机制,给cell添加重用标识符
5.线程同步和异步的区别?
同步:一个线程要等待上一个线程执行完后才能执行当前的线程
异步:就是可以同时执行多个线程
6.堆和栈的区别?
栈区:是由编译器自动分配释放的,主要存放一些函数的参数值,局部变量的值,顺序是先进后出
堆区:是由程序员分配释放,顺序是先进先出
全局区(静态区):初始化的全局变量和静态变量放在一个区域,未初始化的放在相邻的区域,程序运行结束后,有系统进行释放
文字常量区:存放常量字符串,程序结束后有系统释放
程序代码区:存放函数体的二进制文件
7.iOS类是否可以实现多继承?
不可以实现多继承,可以通过delegate和protocol和类别来实现类似多继承
8.iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?
文件写入,对象归档,SQLite,coreData,NSUserdefault
文件写入:永久的保存在磁盘中,只支持NSString,NSData,NSArray,NSDictionary
对象归档:就是给对象数据进行加密,确保数据的安全性,自定义的对象归档必须遵循NDCoding协议
SQLite:数据库需要注意的是FMDB不是数据库,而只是数据库的管理框架
9.iOS的动态性
动态类型:一般使用的都是id类型,也就是当程序运行时,才能判断具体的类型
动态绑定:就是当程序运行时,根据需要调用相应的方法
动态载入:程序运行时,根据需求加载相对应的模块
10.深拷贝和浅拷贝的理解?
深拷贝,拷贝的是内容,浅拷贝拷贝的指针;两者的区别就是查看对象的地址是否有改变,如果有改变就是深拷贝
11.什么是安全释放
在对象dealloc中release之后再将指针置为nil
12.怎样实现一个singleton。
+ (ZMYSingleton *) sharedInstance{
static LOSingleton *sharedInstance = nil ;
static dispatch_once_t onceToken; // 锁
dispatch_once (& onceToken, ^ {
// 最多调用一次
sharedInstance = [[ZMYSingleton alloc] init];
});
return sharedInstance;
}
13.Runloop是什么?
一个runloop是一个事件处理的循环,经常在线程中使用,当开辟一个线程时就会有一个runloop,主线程的runloop默认是开启的,手动开辟的子线程runloop默认是不开启的,如果需要开启就要调用API[[NSRunloop currentRunloop] run]开启。最常见的需要开启的runloop是在子线程里面调用计时器NSTimer
14.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
#define kMIN(X,Y) ((X) > (Y)) ? (Y) :(X)
15.简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
进入后台生命周期走:(将要进入后台,已经进入后台)
- (void)applicationWillResignActive:(UIApplication*)application;
- (void)applicationDidEnterBackground:(UIApplication*)application;
回到前台生命周期走:(将要进入前台,已经进入前台)
- (void)applicationWillEnterForeground:(UIApplication*)application;
- (void)applicationDidBecomActive:(UIApplication*)application;
16.ViewController的loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调 用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
loadView:加载视图时调用
viewDidLoad:试图加载完成后调用
viewWillAppear:试图即将出现的时候调用
viewDidUnload:<iOS6之后废弃>当系统内存不足时会调用该方法,释放掉当前未在window中显示的试图和对应的控制器
17.描述应用程序的启动顺序。
1、程序入口main函数创建UIApplication实例和UIApplication代理实例
2、在UIApplication代理实例中重写启动方法,设置第一ViewController
3、在第一ViewController中添加控件,实现对应的程序界面。
18.为什么写代理的属性都是assign而不是retain?请举例说明。
代理属性使用assign是为了防止循环引用,如self.delegate = self
19.UIImage初始化一张图片有几种方法?简述各自的优缺点。
a.从资源读取,就是图片是从缓存中获取的,首先要先判断缓存中是否有这个图片,没有的话要将图片添加到缓存中在使用,有的话就可以直接使用,但是缺点是执行的效率比较低
b.从手机本地读取,需要获取图片的存储路径,执行效率高,但是用起来比较繁琐
20.这段代码有什么问题吗:
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
死循环
21.用OC写一个冒泡排序
NSMutableArray*array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
for (int i =0; i < array.count;i ++) {
for (intj =0; j < array.count -1 - i; j++) {
if([[arrayobjectAtIndex:j]integerValue] > [[arrayobjectAtIndex:j +1]integerValue]) {
[arrayexchangeObjectAtIndex:jwithObjectAtIndex:j +1];
}
}
}
NSLog(@"%@",array);
22.简述你对UIView、UIWindow和CALayer的理解
UIView继承于UIResponder, UIResponder继承于NSObject,UIView可以响应用户事件,而CALayer做不到这一点;UIView侧重于内容的管理,CALayer侧重于对内容的绘制,对内容进行一些动画处理
(生活中的例子:墙上的照片)
23.frame和bounds区别:
frame: 该view在父view坐标系统中的位置和大小。(参照点是,父视图的坐标系统)
bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统)
本地 坐标系统的关键就是要知道的它的原点(0,0)
24.写一个完整的代理
25.分析json、xml的区别?json、xml解析方式的底层是如何处理的?
xml是一种标签语言,适用于web传输
json是一种比较轻量级的数据交换格式,使用AFNetworking进行json数据解析;优点是兼容性很高,可读性,完全独立于语言文本格式
26.ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
didReceiveMemoryWarning在出现内存警告的时候执行该方法,默认操作就是释放掉暂时没使用的可重用的对象。
27.面向对象的三大特征,并作简单的介绍
封装:把客观的事物封装成抽象的类,隐藏它的内部实现,只提供接口
继承:可以使用现有类的所有功能
多态:不同的对象使用自己的方法去响应相同的消息
28.简单的说一下懒加载
懒加载就是什么时候使用,什么时候创建,开辟内存,这样可以减少内存的占用
29.分别描述类目(categories)和延展(extensions)是什么?以及两者的区别?继承和类目在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
类目:就是在不知道源码的情况下为一个类扩展方法
延展:为一个类声明私有方法和变量
类目的作用就是为已知的类添加方法
30. #import、#include和@class有什么区别
#import与#include都是查看类中的方法,#import是确保头文件只能引入一次,不会引起交叉编译
@class对一个类进行声明,告诉编译器有这个类,但是类中的定义什么都不知道,
@class比#import的编译效率高,它俩的主要区别是解决引用死锁的问题
31.谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?
MVC是一种设计模式,也就是model-view-controller,model是数据模型,view是现实内容,controller相当于是model与view之间的桥梁,它可以将model中的数据在view上显示出来
使用MVC可以提高代码的重用性,便于代码后期的维护与更新
常用的设计模式是:delegate,单例,target-action设计模式
32.字符串替换方法:
[string stringByReplacingOccurrencesOfString:@"png" withString: @""]
33.对于语句NSString* testObject = [[NSData alloc] init]; testObject 在编译时和运行时分别是什么类型的对象?
编译的时候是NSString类型,运行的时候是NSData类型
34.什么是沙盒(sandbox)?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?
沙盒:是指程序的系统文件存储的区域,包含三个文件:Documents,Library和tmp
Documents:存放浏览的文件
Library:存放缓存文件(退出应用不会被删除)
tmp:存放临时文件(退出程序会被删除)
35. isKindOfClass、isMemberOfClass作用分别是什么?
两者的作用都是检测一个对象是否是一个类的成员,不同的是isKindOfClass还可以检测一个对象是否派生自该类的类的成员
36.TCP:是传输控制层协议,是面向连接的,可靠的,基于字节流的运输层;(遵循三次握手原则:给服务器发送消息时,会原路返回一条消息,告诉对方数据已经接收到,然后再返回一条消息,告诉对方也收到了数据,证明这条线路是安全的)
37.static关键字的作用
静态全局变量
static标记的变量会存储到全局变量区,生命周期与程序相同
只在声明的类中可见,并且在声明的类结束后,再次使用的还是之前的值
优点:
节省内存。静态变量只存储一次,可以被所有对象使用,值可以更新,对象可以直接访问到更新后的值
42.应用层有8层:
Telnet协议、FTP文件传输协议、超文本传输协议(HTTP)、SMTP简单邮件传输协议、时间协议、DNS、SNMP简单网络管理协议、TFTP简单的文件传输协议
43.iOS系统框架分为几层?
iOS系统框架分为4层:触摸层(Cocoa Touch),媒体层(Media),核心服务层(Core Services),核心操作系统层(Core OS)
触摸层:是iOS设备上的触摸交互操作,一般程序框架都是在触摸层
媒体层:在应用中使用媒体文件,进行音频,视频,以及动画效果的实现
核心服务层:可以访问iOS中的一些服务
核心操作层:就是实现一些内存管理,文件管理和电源管理等系统的操作