答:管理方式:对于栈来说,是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放工做由程序员控制,容易产生memory leak。java
二、数组和链表什么区别?ios
答:数组是将元素在内存中连续存放,因为每一个元素占用内存相同,能够经过下标迅速访问数组中任何元素。程序员
链表刚好相反,链表中的元素在内存中不是顺序存储的,而是经过存在元素中的指针联系到一块儿。
三、delegate和notification什么区别,什么状况使用?面试
答:Delegate:
消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate赞成然而后发送者响应事件,objective-c
delegate机制使得接收者能够改变发送者的行为。数据库
一般发送者和接收者的关系是直接的一对多的关系。数组
Notification:
消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。安全
一般发送者和接收者的关系是间接的多对多关系。服务器
四、什么是MVC,为何使用MVC,有什么好处?多线程
答: 分别为: 模型(Model),视图(View)和控制Controller)。
模型(Model) “数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。
“模型”有对数据直接访问的权力,例如对数据库的访问。
视图(View) 视图层可以实现数据有目的显示。
控制器(Controller) 控制器起到不一样层面间的组织做用,用于控制应用程序的流程。
五、从一个数组中找出重复的元素打印出来
NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",@"7",@"4",@"5",@"2",@"6",@"5",nil];
NSMutableArray *arrmu = [[NSMutableArrayalloc]init];//过滤
NSMutableArray *sameArray = [[NSMutableArrayalloc]init];//找出相同的
for (int i = 0 ; i < [arrcount]; i++) {
id str = [arr objectAtIndex:i];
if ([arrmu count] == 0)
{
[arrmuaddObject:str];
}
else{
BOOL flag = NO;
for (int j = 0; j < [arrmucount]; j++ ) {
if ([strisEqual:[arrmu objectAtIndex:j]])
{
[sameArrayaddObject:str];
flag =YES;
break;
}
else{
flag =NO;
}
}
if (flag == NO) {
[ arrmuaddObject:str];
}
}
}
NSLog(@"sameArray : %@",sameArray);
还有两种直接找出的方法,上代码:
一:
NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",nil];
NSSet *set = [NSSetsetWithArray:arr];
NSLog(@"%@",[setallObjects]);
二:NSArray *arr =@[@1,@2,@1];
NSMutableDictionary *dict = [NSMutableDictionarydictionary];
for (NSNumber *numberin arr) {
[dictsetObject:numberforKey:number];
}
NSLog(@"%@",[dictallValues]);
六、UITableView可否绑定多个数据源?
答:不能
七、一个UIViewController可否管理多个UITableView ?
答:能够
八、ios四、五、6相对于以前的版本添加了哪些新特性?
这个就比较多了,好比:抛弃谷歌地图 新推Maps应用 ,大幅增强中国本地化支持,Siri开口讲普通话,经过iCloud体验分享乐趣,Passbook电子票券管理,随时随地的FaceTime,电话功能加强,Safari支持全屏浏览,Mail应用新增VIP,万能辅助:更强大等等了
答:发送同步请求,程序将中止用户交互,直至服务器返回数据完成,才能够进行下一步操做,
异步请求不会阻塞主线程,而会创建一个新的线程来操做,用户发出异步请求后,依然能够对UI进行操做,程序能够继续运行。
十、iOS中的多线程操做、多线程方式
答:iOS提供了方便的多线程调用机制:NSOperation和NSOperationQueue。它的使用方法也很简单,
通常都是将NSOperation对象加入到NSOperationQueue队列中,加入后队列就开始处理,知道任务操做完成。
十一、UIViewController的生命周期
答:当一个视图控制器被建立,并在屏幕上显示的时候。 代码的执行顺序
// 视图显示在屏幕上的顺序
一、 alloc 建立对象,分配空间。
二、init (initWithNibName) 初始化对象,初始化数据。
三、loadView 从nib载入视图, 这一步不须要去干涉。除非没有使用xib文件建立视图。
四、viewDidLoad 加载完毕,能够进行自定义数据以及动态建立其余控件。
五、viewWillAppear 视图将出如今屏幕以前,立刻这个视图即将显示在屏幕上。
六、viewDidAppear 视图已在屏幕上渲染完成。
// 视图将被从屏幕上移除的顺序
一、viewWillDisappear 视图将被从屏幕上移除以前执行。
二、viewDidDisappear 视图已经被从屏幕上移除。
三、dealloc 视图被销毁,此时须要在init和viewDidLoad中建立的对象进行释放。
四、viewDidUnload 出现内存警告在内存不足时执行,并对全部非当前显示的controller执行。
本视图的全部子视图将被销毁,以释放内存,此时开发者须要手动对viewLoad、viewDidLoad中建立的对象释放内存。
由于当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图。
十二、Autorerelease对象何时释放?
答:autorelease实际上只是把对release的调用延迟了,对于每个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的全部Object会被调用Release。
1三、iOS数据持久化方式
答:四种:属性列表、对象归档、SQLite3和Core Data
1四、Object-c的类能够多重继承么?能够实现多个接口么?Category是什么?重写一个类的方式用继承好仍是分类好?为何?
答:Object-c的类不能够多重继承;能够实现多个接口,经过实现多个接口能够完成C++的多重继承;Category是类别,通常状况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其余类与原有类的关系。
15. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import”"又什么区别?
答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使 用#import头文件会自动只导入一次,不会重复导入,至关于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,能够解决头文件的相互包含;#import<>用来包含系 统的头文件,#import””用来包含用户头文件。
16.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么做用,在那种状况下用?
答:readwrite 是可读可写特性;须要生成getter方法和setter方法时
readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不但愿属性在类外改变
assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
copy 表示赋值特性,setter方法将传入对象复制一份;须要彻底一份新的变量时。
nonatomic 非原子操做,决定编译器生成的setter getter是不是原子操做,atomic表示多线程安全,通常使用nonatomic
17.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int
答:object-c的数据类型有 NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,建立后即是对象,而C语言的基本数据类型int,只是必定字节的内存空间,用于存放数值;而object-c的NSNumber包含有父类NSObject的方法和 NSNumber本身的方法,能够完成复杂的操做。
答:Profile-> Instruments ->Time Profiler
答:线程建立有三种方法:使用NSThread建立、使用 GCD的dispatch、使用子类化的NSOperation,而后将其加入NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,若是想延时执行代码能够用performSelector:onThread:withObject:waitUntilDone:
21.描述一下iOS SDK中如何实现MVC的开发模式
答:MVC是:模型--视图--控制 开发模式,对于iOS SDK,全部的View都是视图层的,它应该独立于模型层,由视图控制层来控制。全部的用户数据都是模型层,它应该独立于视图。全部的ViewController都是控制层,由它负责控制视图,访问模型数据。
23. Object-C有私有方法吗?私有变量呢?
答:objective-c – 类里面的方法只有两种, 静态方法和实例方法,全部实例变量默认都是私有的,全部实例方法默认都是公有的。
24.浅拷贝和深拷贝区别是什么
答:浅拷贝:只复制指向对象的指针,而不复制引用对象自己。
深拷贝:复制引用对象自己。
答: 当您向一个对象发送一个autorelease消息时,Cocoa就会将该对 象的一个引用放入到最新的自动释放池。
它仍然是个正当的对象,所以自动释放池定义的做用域内的其它对象能够向它发送消息。当程序执行到做用域结束的位置时,
自动释放池就会被释放,池中的全部对象也就被释放。
26.单件实例是什么
答: Foundation 和 Application Kit 框架中的一些类只容许建立单件对象,即这些类在当前进程中的惟一实例。
举例:NSFileManager 和NSWorkspace类在使用时都是基于进程进行单件对象的实例化。
当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,若是该实例还不存在,则首先进行实例的分配 和初始化。
27.类别的做用?继承和类别在实现中有何区别?
答:category 能够在不获悉,不改变原来代码的状况下往里面添加新的方法,只能添加,不能删除修改。
而且若是类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,由于类别具备更高的优先级。 类别主要有3个做用:
(1)将类的实现分散到多个不一样文件或多个不一样框架中。
(2)建立对私有方法的前向引用。
(3)向对象添加非正式协议。
继承能够增长,修改或者删除方法,而且能够增长属性。
28.类别和类扩展的区别。
答:category和extensions的不一样在于 后者能够添加属性。另外后者添加的方法是必需要实现的。
extensions能够认为是一个私有的Category。
29.KVO and KVC?
答:kvc:键 - 值编码是一种间接访问对象的属性,使用字符串来标识属性,而不是经过调用存取方法,直接或经过实例变量访问的机制。 不少状况下能够简化程序代码。apple文档其实给了一个很好的例子。 kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。 具体用看到用到过的一个地方是对于按钮点击变化状态的的监控。 好比我自定义的一个button [cpp]
答:代理的目的是改变或传递控制链。容许一个类在某些特定时刻通知到其余类,而不须要获取到那些类的指针。能够减小框架复杂度。 另一点,代理能够理解为java中的回调监听机制的一种相似。
答: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。
答:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统) bounds指的是:该view在自己坐标系统中 的位置和大小。(参照点是自己坐标系统)
答:selector是一个方法的名字,method是一个组合体。
答:Objective-c只支持单继承,若是要实现多继承的话,能够经过类别和协议的方式来实现,cocoa 中全部的类都是NSObject 的子类,多继承在这里是用protocol 委托代理 来实现的。
2.不能调用release、retain、autorelease、retainCount
3.dealloc注意
1> 不能在dealloc中调用[super dealloc]
2> 不能在dealloc中释放资源
4.@property参数说明
1> retain 改成 strong
2> 基本数据类型(int\float)仍是用assign
3> copy 仍是 copy
4> 若是2个对象循环引用,一端用strong,一端用weak
5> weak是用在对象上,weak其实做用跟assign至关
5.ARC中只容许使用经过@autoreleasepool {}建立自动释放池
// Grand Central Dispatch简称GCD技术
// Do any additional setup after loading the view.
// dispatch_queue_t newDispath = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// dispatch_async(newDispath, ^{
// [self downloadImage];
// });
// #defineDISPATCH_QUEUE_PRIORITY_HIGH 2
// #defineDISPATCH_QUEUE_PRIORITY_DEFAULT 0
// #defineDISPATCH_QUEUE_PRIORITY_LOW (-2)
// #defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN
/*dispatch queue分为下面三种:
* Serial:又称为private dispatch queues,同时只执行一个任务。Serial queue一般用于同步访问特定的资源或数据。当你建立多 个 Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。
* Concurrent: 又称为global dispatch queue,能够并发地执行多个任务,可是执行完成的顺序是随机的。
* Main dispatch queue它是全局可用的serial queue,它是在应用程序主线程上执行任务的
*/
// 通常GCD 能够以下操做
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 耗时的操做
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
[selfexampleDispatch];
/*
*系统给每个应用程序提供了三个concurrent dispatch queues。
*这三个并发调度队列是全局的,它们只有优先级的不一样。
*由于是全局的,咱们不须要去建立。咱们只须要经过使用函数dispath_get_global_queue去获得队列
*/
dispatch_queue_t globalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
NSLog(@"global:%p",globalQ);
dispatch_queue_t mainQ =dispatch_get_main_queue();
NSLog(@"mainQ:%p",mainQ);
/*
*虽然dispatch queue是引用计数的对象,可是以上两个都是全局的队列,不用retain或release。
*/
/*
*dispatch_group_async能够实现监听一组任务是否完成,完成后获得通知执行其余的操做。
*这个方法颇有用,好比你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。
*/
timeInt = 0;
[NSTimerscheduledTimerWithTimeInterval:1
target:self
selector:@selector(checkingTime)
userInfo:nil
repeats:YES];
[selfexampleDispath_group];
/*dispatch_barrier_async的使用
*dispatch_barrier_async是在前面的任务执行结束后它才执行,并且它后面的任务等它执行完成以后才会执行
*/
[selfexampleDispatch_barrier];
/*dispatch_apply
*执行某个代码片断N次。
*/
dispatch_apply(5, globalQ, ^(size_t index) {
// 执行5次
});