1.简述OC中内存管理机制
OC的内存管理机制是自动引用技术,内存管理的原则是谁开辟谁释放,分为ARC和MRC,MRC的话就是需要我们程序员手动管理内存,ARC不需要我们手动管理内存,系统会自行管理。
2.readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
readWrite读写特性, 可读可写.
readonly只读, 只有getter, 没有setter.
assign一般用于基本数据类型和ID类型.
copy拷贝, 一般用于 NSString. 分为深拷贝和浅拷贝, 深拷贝拷贝的是对象, 浅拷贝拷贝的是指针.
nonatomic非原子性, 不考虑线程安全, 优点是效率高.
atomic原子性, 优点是线程安全, 缺点是效率低.
strong强引用, 和MRC下的retain一样. weak弱引用, 类似MRC下的assign. 但是要注意的是strong和weak都是修饰对象类型的属性的, 不能修饰基本数据类型. ARC下仍然使用assign修饰基本数据类型.
3.关于iOS多线程问题
仔细阅读:http://www.cocoachina.com/ios/20150731/12819.html
4.提升UITableView性能的几点建议
1.cell高度计算 (可以先根据内容高度数组,返回cell时直接用数组返回高度)
2.cells的重用
3.cell快速滑动的时候不加载图片,停止滑动的时候加载图片
4.避免阻塞主线程
5.缓存下载的图片
6.不要过多使用Xib(如果可以的话使用storyboard)
7.使用CoreGraphics
8.透明度
也可仔细阅读:http://www.cocoachina.com/ios/20150729/12795.html
6. 线程同步和异步的区别?
同步:一个线程要等待上一个线程执行完之后才能执行,生活中的例子(上厕所)。
异步:同时去做两个或者多个线程。比如边听歌边看报。
7.堆和栈的区别?
栈区(stack)--由编译器自动分配释放,存放函数的参数值、局部变量的值。先进后出
堆区(heap)--一般由程序员分配释放。先进先出
全局区(静态区)(static)--全局变量和静态变量。程序结束后由系统释放。
文字常量区--常量字符串存放在这里。程序结束后由系统释放。
程序代码区—存放函数体的二进制文件。
8. iOS类是否可以多继承?
不可以,可以通过delegate和protocol和类目来实现类似多继承。
9.iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?
1.Write写入方式:永久保存在磁盘中。只支持NSString、NSData、NSArray、NSDictionary。
2.NSKeyedArchiver(归档)采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议
3.SQLite(FMDB)注意FMDB不是数据库, 而是一个SQLITE管理框架.
4.CoreData切记coredata不是数据库, 他的存储核心思想是托管对象。只是咱们经常用的存储文件为SQLite.还可以用XML, 二进制等方式.
10.iOS的动态性
1.动态类型。 如id类型。实际上静态类型因为其固定性和可预知性而使用得更加广泛。静态类型是强类型,而动态类型属于弱类型。运行时决定接收者。
2. 动态绑定。让代码在运行时判断需要调用什么方法,而不是在编译时。
3. 动态载入。让程序在运行时添加代码模块以及其他资。
11.深拷贝和浅拷贝的理解?
深拷贝拷贝的是内容,浅拷贝拷贝的是指针。如果子类对象的地址改变就是深拷贝反之浅拷贝。
12.什么是安全释放
在对象dealloc中release之后再把指针置为nil
13.怎样实现一个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的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。主要是是为了减少 cpu无谓的空转。每个线程都有Runloop, 主线程的Runloop时默认开启的, 手动开辟的子线程Runloop是默认不开启 的, 如果需要开启, 需要调用API[[NSRunloop currentRunloop] run]开启.
最常见的需要开启Runloop的是在子线程里面调用计时器(NSTimer), 如果不开启runloop循环方法就不能正常执行.
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:没有正在使用nib视图页面,子类将会创建自己的自定义视图层
viewDidLoad:试图被加载后调用
viewWillAppear:试图即将出现的时候调用
viewDidUnload:
17.描述应用程序的启动顺序。
1、main函数创建UIApplication实例和UIApplication代理实例
2、在UIApplication代理实例中重写启动方法,设置第一ViewController
3、在第一ViewController中添加控件,实现对应的程序界面。
18.为什么写代理的属性都是assign而不是retain?请举例说明。
防止循环引用,
Teacher *teacher=[[Teacher alloc] init];
Student * student=[[Student alloc] init];t
eacher.delegate=student;
student.delegate= teacher;
在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。
19.UIImage初始化一张图片有几种方法?简述各自的优缺点。
两种:
1、从资源读取 , 先在缓存里面查看图片是否存在, 没有的话将图片添加进缓存再使用. 有的话直接使用缓存里的. 图片用的次数比较多, 使 用这种方式. 缺点是效率低下.UIImage *image = [UIImage imageNamed:@”1.png”];
2 .从手机本地读取, 直接加 载图片. 在图片使用率低的图片时 使用. //读取本地图片非resourceNSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];[UIImage imageWithContentsOfFile:aPath3]
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 (inti =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继承于NSObject,不能响应事件。侧重于对内容的绘制,以及对内容进行动画处理,依赖于UIView来显示。
UIWindow是特殊的UIView,通常一个app只有一个UIWindow,我们可以创建一个视图控制器,并添加到 UIWindow上面,这样的话这个视图控制器就是app的第一响应者(First Responder).
23.frame和bounds区别:
frame:view在父视图坐标 中的位置
bounds:view在本地坐标中的位置
center:view的中心点在父视图中的位置
也可仔细阅读:http://blog.csdn.net/mad1989/article/details/8711697
24.写一个完整的代理
25.分析json、xml的区别?json、xml解析方式的底层是如何处理的?
XML是扩展通用标记语言 (SGML),适合 Web 传输。 提供统一的方法来描述和交换数据。
JSON(JavaScriptObject Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。
26.ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
在出现内存警告的时候调用,释放掉暂时没使用的可重用对象。这个方法不能手动调用!!!
27.面向对象的三大特征,并作简单的介绍
封装、继承、多态。
封装:是把客观事物封装成抽象的类,隐藏内部的实现,对外部提供接口。
继承:可以使用现有类的所有功能,并且在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:不同的对象以自己的方式响应相同的的消息叫做多态。
28.简单说一下懒加载
用到的时候初始化,不用的话不初始化只是一个指针,不占用内存空间
29.分别描述类目(categories)和延展(extensions)是什么?以及两者的区别?继承和类目在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
category类目:在不知道源码的情况下为一个类扩展方法,
extension:为一个类声明私有方法和变量。
继承是创建了一个新的类。
30.#import、#include和@class有什么区别
#include C语言中引入头文件,可能出现交叉编译
#import在OC中引入自己创建的头文件
#import””是引入自己创建类的头文件
#import<>是引入系统类的头文件
#import不会出现交叉编译
@class对一个类进行声明,告诉编译器有这个类,但是类的定义什么的都不知道.
31.谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?
MVC是Model-VIew-Controller模型-视图-控制器。 model数据模型,view是对这些数据的显 示,viewcontroller就是把model拿到view中显示,起到model和view之间桥梁的作用。MVC可以实现程序最大程 度的可重用性。MVC各元素分开也能便于代码的更新、维护以及提高代码的重用性.
单例模式,delegate设计模式,target-action设计模式
32.字符串替换方法:
[string stringByReplacingOccurrencesOfString:@"png" withString: @""]
33.对于语句NSString* testObject = [[NSData alloc] init]; testObject 在编译时和运行时分别是什么类型的对象?
编译的时候是NSString类型,运行的时候是NSData类型
34.什么是沙盒(sandbox)?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?
iOS应用程序只能在为该程序创建的文件系统中读取文 件,不可以去其它地方访问,此区域就是沙盒,用来保存所有的非代码文件。(例如图像,图标,声音,映像,属性列表,文本文件等。)
默认每个沙盒有3个文件夹:Documents, Library 和 tmp。
Documents:保存程序中建立的或在程序中浏览到的文件数据
iTunes备份和恢复的时候会包括此目录
Library/Caches:存放缓存文件,iTunes不会备份此目录,目录下文件在应用退出时不删除
tmp:提供一个即时创建临时文件的地方。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
35.isKindOfClass、isMemberOfClass作用分别是什么?
-(BOOL) isKindOfClass: classObj判断是否是这个类或者是这个类子类的实例
-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例
36.iOS中UIViewController的生命周期及iOS程序执行顺序:
视图控制对象生命周期
init-初始化程序
viewDidLoad-加载视图
viewWillAppear-UIViewController对象的视图即将加入窗口时调用;
viewDidApper-UIViewController对象的视图已经加入到窗口时调用;
viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;
viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;
viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;
viewDidUnload-当内存过低,释放一些不需要的视图时调用。
具体可参考:http://blog.csdn.net/huifeidexin_1/article/details/7566226
37. 简述多线程。
答:Grand Central Dispatch简称GCD 解决多核并行运算的一种方案,主要有两种队列:并行、串行。
NSOperationQueue以队列的形式实现了多线程,基于GCD的封装。
NSThread 轻量级多线程,不常用 缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
39. 该问题涉及编译器的“内存对齐”问题:
例如:
对于结构体来说,按成员中所占字节最大的是float类型,占用4个字节,一共有3个成员,所以总的占用字节为:4 * 3 = 12.可通过编译器命令来设定: #progma pack (2)
40. TCP/IP 建立连接的过程:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立连接;
第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。
(所谓的三次握手,就是要有三次连接信息的发送、接收过程。TCP连接的建立需要进行三次连接信息的发送、接收。)
41.什么是UDP和TCP的区别是什么?
TCP 的全称是传输控制协议,这种协议可以提供面向连接的、可靠的、点到点的通信。
UDP 的全称是用户数据包协议。他可以提供非连接的不可靠的点到多点的通信,是osi参考模型中一种无连接的传输层协议,提供面向事务的简单的不可靠信息传输,_IETFRFC 768 是UDP 的正式规范;
选择何种协议,看程序注重那个方面,可靠抑或快速。
42.static关键字的作用
静态全局变量
优点:
1、节省内存。静态变量只存储一处,但供所有对象使用。
2、它的值是可以更新的。
3、可提高时间效率。只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。
43.iOS系统框架分为几层,分别是什么
1、Core OS是核心操作系统层,包括内存管理、文件系统、电源管理以及一些其他的操作系统任务。
2、Core Services是核心服务层,用来访问iOS的一些服务。
3、Media是媒体层,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。
4、Cocoa Touch是可触摸层,本质上来说它负责用户在iOS设备上的触摸交互操作。