1.堆栈的区别
对于栈来讲,是由编译器自动管理的,无需我们手动去控制;
对于堆来讲,是程序员来控制的,容易产生memory leak。
2.数组和链表的区别
数组是将元素在内存中连续存放的,由于没有元素占用的内存相同,可以通过下表迅速访问。
链表中的每个元素在内存中不是顺序存储的,而是通过存在匀速的指针联系在一起的。
3.de'legate 和notification 的区别,和使用的情况
delegate:消息的发送者(sender)和接受者(receiver)一个事件将要发生,delegate同意然后发送响应者事件,delegate机制使得接受者可以改变发送者的行为。通常发送者和接受者的关系是一对多的管理
Notification:消息的发送者告知接受者事件已经发生或者将要发生,仅此而已,接受者不能反过来影响发送者的行为。通常发送者和接受者的关系是间接的多对关系。
4 什么是mvc 为什么要要使用MVC,有什么好处
mvc 是一种设计模式
model 数据模型:用于封装与程序的业务逻辑有关的数据以及对数据的处理方法,有对数据直接的访问权限。
view 实体能够实现数据的目的显示。
controller 控制器起到不同层面的主治作用,用于控制应用程序的流程。
- 一个UITableView能否绑定多个数据源
不呢 - 一个UIViewcontroller能否管理多个UItableview
能够 - ios4.5.6 相对于以前的版本添加了那些新特性
这个就很多了, 比如抛弃了gool地图新推maps应用,大幅加强中国本地化的支持,siri 开口讲普通话,通过icloud体验分享乐趣,Passbook电子票圈的管理,随时随地FacetTime,电话功能郑强,Safari支持全屏浏览,Mail应用新增Vip
万能辅助器,更强大了。 - 同不请求和异步请求的区别
发送同步请求的时候,程序将停止用户交互,知道服务器返回数据,才能进行下一步操作,异步操作不会阻塞线程,而是会建立一个新的线程来操作,用户发出请求后依然可以实现和用户的操作。 - iOS 中的多线程操作,多线程方式
iOS 中提供了方便的多线程调用机制:NSOperation 和NSOperationQueue 使用方法很简单一般都是讲NSOperation对象加入到NSOperationQueu 队列中,然后在执行,直到任务操作完成
10 UIViewController的生命周期
当一个视图控制器被创建,并在屏幕上显示的时候,代码执行的顺序是- alloc 创建对象,分配内存空间。
- init 初始化对象,初始化数据
- loadView 加载view
- viewDidLoad 控件 加载完毕后可以对数据及动态创建其他
5.viewWillApper 视图加载在屏幕之前,马上这个视图就要显示
6.viewDidAppear 视图已经在屏幕上渲染完成
// 视图控制器重屏幕上移除的 - vieWillDisappear 视图将被从屏幕移除之前执行
- vieDidDISappear 视图已经从屏幕上移除
- dealloc 对象进行释放,视图被销毁
- viewDidUnload 显示的controller执行,出现内存警告在内存不足的时候调用,并对所有非当前的视图的字视图销毁,来释放内存空间,此时开发者需要手动的对viewLoad,ViewDidLoad 中创建的对象释放内存。因为当这个视图再次显示在屏幕的时候回调用loadView , ViewDidLoad再次调用,一遍再次构造视图。
11 Autorerelease对象什么时候释放
autorelease 实际上是把对release的调用延迟了,对于一个Autorelease 系统只是把该Object 放入了当前的AutoreleasePool中,当该pool被释放的时候该pool中的所有对象会调用Release
12.iOS 数据持久化
属性列表
对象归档
SQLite3
CoreDa'ta
14 . Object -c 的类可以多重继承吗?可以实现多个接口么?Category是什么?重写一个类的方式用继承还是分类好?为什么?
Object中的类不能使用多重继承,可以实现对个接口,通过实现多个接口可以完成c++的多种继承, Category是类别 一般情况用分类好,用Category 去重写的方法,仅对本Category 有效,不会影响到其他类与原有类的关系。
15 #import #include 的区别, @class #import <> 跟#import“” 的 区别
import 是Object_C 导入头文件的关键字,#include 是C /C++ 导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复的导入,相当于#include 和#p'ragme once
@class 告诉编译器一个类的申明,当执行时,才去查看类的实现文件,可以解决头文间的相互包含,
import《》用力来包含系统的头文件,#import 用来包含用户的头文件
16 属性 readwrite , readonly ,assign, retain , copy ,nonatomic 是什么作用在什么情况下使用。
- readwrite 是可读可写特性,需要生成getter 方法和setter方法是
2.readonly 是只读属性,只会生成getter方法,不会生成setter方法。 - 不希望属性的内外发生改变,assign是赋值特性,setter方法将传入的参数赋值给实例变量,
- retain 仅设置变量的时候,表示持有特性,setter 方法将传入参数先保留,在赋值,传入的参数retaincount 会加1
- copy 表示赋值特性,setter方法将传入的对象复制一份,需要完全的一份新的变量的时候,
6 . nonatomic 非原子操作,决定编译器生成的setter getter 方法是否是原子操作,atomic表示多线程安全,一般用nonatomic
17 在Object-C中数据类型有哪些,和c 的基本类型有什么区别。
Object-c的数据类型有NSString ,NSNumber,NSArray,NMutableArray,NSData这些都是class创建以后都是对象,而c语言的是基本数据类型,只是一定字节的内存空间,用于存放数组,而在object-c 的NSNumber 包含父类NSObject 的 方法和自己的方法可以完成复杂的操作。
18 Object-C如何对内存管理的,说说的你看法和解决方法
Object -C 的内存管理主要有三中方式ARC (自动内存计数),手动管理内存计数,内存池。解决的方法的话是谁持有谁释放。
19 如何都ios设备进行性能测试
Profile -> Instruments ->Time Profiler
20 Object c中创建线程的方法是什么?如何在主线程中执行代码,方法是什么》如何延迟执行代码的方法又是什么?
- 创建线程的方法有三种,NSThread 创建,使用GCD的dispatch ,适应NSOPeration然后加入NSOperationQueue中
- 在主线程执行代码的方法是 performSelectorOnMainThread;
- 如果想延迟执行代码的方法有PerformSelector:onThread:withObject:waitUntilDone;
21描述一下 iOS SDK中如何实现MVC的开发模式的。
mvc 是模型-》视图-》控制 开发模式。对于ios的SDK 所有的View都是视图控制图层的,他应独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图,说的的ViewController 都是控制层,由它负责控制视图,访问模型数据。 - 定义属性的时候,什么情况下使用 copy ,assign,retain?
- adding 用于简单的数据类型,如NSInteger,double,bool等。
- retain和copy 用于对象,copy 相当于a指向一个对象,b也指向同样的对象时候,如果使用assign a如果释放,在调用b就会crash'
3.若果使用copy 的方式,a和b各自有自己的内存,就可以解决这个问题。retain 会是计数器加 1 ,也可以解决assign的问题。
4.atomic 和nonatomic 用来解决编译器生成的getter 和setter是否是原子操作,多线程的环境下,原子操作是必要的,否则可引起错的结果,加了atomic的setter函数变成这样
if(property != newValue){
[Property release]
property = [newValule retain];
}
23 Object -c 有私有方法吗? 私有变量吗?
Object 类里面的方法只有两种,静态的方法和实力方法,所有实例变量都是私有的,所有的实例方法默认都是共有的、
24 .浅拷贝和深拷贝的区别是
浅拷贝:只是复制对象的指针,而不是复制应用对象的本身,深拷贝就是复制应用对象的本身、、、
25.自动释放池是什么,是如何工作的?
当你想一个对象发送autorelease 消息的时候,Cocoa 就会将该对象的一个引用放到罪行的自动释放池,他任然是个正当的对象,因此自动释放池定义的作用域内的其他对象可以向他发送消息。当长须执行到作用域结束的位置,自动释放池就会被释放,池子中的所有对象就会被释放。
26.单件实例是什么?
Foundation 和Application kit 框架中的一些类只允许创建单件对象,这个对象就是在当前进程中的唯一实例。NSFileManger 和NSWorkspace类在使用的时候是基于进程进行的单件对象的实例化。当向这些类请求实例化的时候,他们会想你传递单一的一个引用,如果该实例还不存在,者首先要实例的分配和初始化、
27 。类别的作用?继承和类别在实现中有什么区别
category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加不能删除修改。并且如果类别和原来类中的方法产生名冲突,则类别间覆盖原来的方法,应为列别具有更高的优先级。类别中主要有3个作用。
- 将类的实现分散到多个不同文件或多个不同的框架中。
2.创建对私有方法的前向引用。 - 向对象添加非正式的协议。继承可以增加,修改或者删除方法,并且可以增加属性。
- 类别和扩展的区别
category 和extensions 的不同在于后者可以添加属性,宁外后者添加的方法是必须要实现的,extensions 可以认为是一个私有的Category。 - KVO和KVC
KVC 键 值编码 是一种简介访问对象的属性,使用字符串来表示属性,而不是日通过调用存取的方法,直接或通过实例变量访问机制。很多情况下可以简化代码。apple。
KVO键值观察者机制,他提供和了观察一个数次那个变化的方法,极大的简化了代
[self addObserver:selforKeyPath:@"highlighted" options:0 context:nil]; #pragma mark KVO
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)objectchange:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"highlighted"])
{ [self setNeedsDisplay];
}
} 对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一 样的。 对于kvc机制如何通过key寻找到value: “当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过 几种不同的方式解析这个调用。首先查找对象是否带有someKey 这个方法,如果没找到, 会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试 图调用 -(id)valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出 一个NSUndefinedKeyException异常错误。(cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法, 还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。) 设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中 请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“ 来至cocoa,这个说法应该挺有道理。 因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个 相关的keypath就行了,可以按照kvc查找的逻辑理解,就说的过去了。 - 代理的作用
代理的目的是改变或传递控制链,允许一个类在有个特定时刻通知其他类,而不需要获得哪些类的指针。可以减少框架的复杂程度。代理可以理解为jave只能的回调监听机制的一种。
31 响应者链
时间的响应链,包括点击时间,画面刷新等。在试图栈内从上倒下,或者从下岛上传播。
32frame 和bounds的区别
1.frame 是指 该view在父view坐标系统中的位置和大小(参照点事父类的坐标系统) - bounds 该view 在本省坐标系统中的位置和大小(参照点是自己的坐标系统)
- 方法和选择器有什么不同
selector 是一个方法的名字,method 是一个组合体
34 ARC自动引用技术 - ARC 是编译特性,不是运行时特性,只是在编译的时候,编译器会自动加上释放代码。
- 不能使用release、retain autorelease retainCont
- dealloc 注意
不能再dealloc中调用【super dealloc】;
不能在dealloc 中释放资源。 - @property 参数说明
1.retain 改为strong- 基本类型数据还是用assign
- copy 还是用copy
- 如果两个对象循环引用,一个用strong 一个用weak
- weak 是用在对象上,weak其实作用和assign相当
- ARC 中只允许使用通过@autoreleasepool{}创建自动释放池
36.GCD
Grand Central Dispatch 简称GCD 解决多核并运算的一种方法
Grand Central Dispatch
dispatch _queue_t newDispath = dispatch_get _global _queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(newDispath, ^{[self downloadImage]})
deifine DISPATCH_QUEUE_PRIORITY_HIGH 2
define DISPATXH_QUEUE_PRIORITY_DEFALT 0
distatch queue 分为三种
Serial(串行) 有称为private dispatch queues ,当你在同时执行一个任务。
Serial queue 通常用于同步访问特定的资源或数据,当你创建多个serial
queue时,虽然他们各自是同步执行,但Serial queue 与Serialqueue 之间并发执行的。(这个有问题)
Concurrent(并发)又称为global dispatch queue , 可以并发的执行多个任务,但是执行完成的顺序是随机的。
Main dispatch queue 他是他是全局可用的serial queue ,他是在应用程序主线,程序上执行任务。
3.一般GCD 可以如下操作
dispatch_async(dispatch_er_global _queue(DISPATCH_QUEUE_PRIORity_DEFAULT,0)),^{
dispatch_async(dispatch_get_main_queue(),
}
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他 的操作。 *这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知
37 多线程
1 开多线程
1.NSThread
2.GCD(重点) - Grand central Dispatch
- NSOperation
2.开线程的方式
NSThread *thread= [NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
thread start];
直接启动
【NSThread datachNewThreadSelector:@selector(run) toTatget:self withObject:nil】;
[self perfprmSelectorInbachround:@sekectir(run) WithObject:nil];
2.0 其他用法
NSThread thread = [NSthread CurrentThread];
+(NSThread)mianThread.
3>线程间的通信
performSwlectorOnMainThread...
2.GCD (重点)
1》队列的类型
*并发队列
获得全局的并发队列:dispatch_get_global_queue
*串行队列
a。自己创建
dispatch_queue_cteate
b.主队列
dispatch_get_main_queue
2>执行任务的方法
*同步 (sync)执行
*异步(async)执行
3>了解队列和方法和配合使用
4》 线程间通信
dispatch _ async()
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
dispatch_async(dispatch_get_main_queue())^{
}
}
5>其他用法
dispatch_once
dispatch_after
dispatch_group_async 和dispatch - group _notify
3.NSOperation
1> 基本使用
NSInvocationOperation
NSBlockOperation
2>NSOperationQueue
设置最大的并发数
-( void)setMaxConcurrentOperation:(NSInterger)op;
设置依赖
[operationb addDependency:operationA];
3>自己定义Operation的基本流程
4>如何解决网络请求中的图片重复下载的问题。