1.谈谈Object-C的内存管理方式及过程?java
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。ios
解决方法的话: 谁持有,谁释放。程序员
2.#import和#include的区别,@class表明什么?数组
@class通常用于头文件中须要声明该类的某个实例变量的时候用到,在m文件中仍是须要使用#import服务器
而#import比起#include的好处就是不会引发重复包含网络
这两种的方式的区别在于:多线程
一、#import方式会包含被引用类的全部信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B *b 只是类的声明,具体这个类里有什么信息,这里不须要知道,等实现文件中真正要用到时,才会真正去查看B类中信息;并发
二、使用@class方式因为只须要只要被引用类(B类)的名称就能够了,而在实现类因为要用到被引用类中的实体变量和方法,因此须要使用#importl来包含被引用类的头文件;app
三、经过上面2点也很容易知道在编译效率上,若是有上百个头文件都#import了同一 个文件,或者这些文件依次被#improt(A->B, B->C,C->D…),一旦最开始的头文件稍有改动,后面引用到这个文件的全部类都须要从新编译一遍,这样的效率也是可想而知的,而相对来 讲,使用@class方式就不会出现这种问题了;框架
四、对于循环依赖关系来讲,比方A类引用B类,同时B类也引用A类,
当程序运行时,编译会报错,
由上可知,@class是放在interface中的,只是在引用一个类,将这个被引用类做为一个类型,在实现文件中,若是须要引用到被引用类的实体变量或者方法时,还须要使用#import方式引入被引用类。
因此,通常来讲,@class是放在interface中的,只是为了在interface中引用这个类,把这个类做为一个类型来用的。 在实现这个接口的实现类中,若是须要引用这个类的实体变量或者方法之类的,仍是须要import在@class中声明的类进来.
@class
一个.h声明几个类时,互相使用时。
@class
@interface A
{
B *B;
}
@interface B{}
3.Object-C有私有方法吗?私有变量呢
Objective-C中的类自己并无私有方法这个概念,声明在 .h 文件中的方法都是公有的。不过,要想实现私有方法的效果仍是有办法的,就是用Category。
// Hello.h
#import <Cocoa/Cocoa.h>
@interface Hello : NSObject {
//变量声明
}
// 方法声明
@end
//
// Hello.m
#import "Hello.h"
@interface Hello () //=>此处Hello命名一致,后边跟括号
//=>@property (某种) aType ivarName ; 可实现私有变量
// 私有方法声明
- (void)test;
@end
@implementation Hello
// 私有方法实现
//=>@synthesize ivarName; 有私有变量的话
- (void)test {
// ..
}
// 方法实现
@end
在上面这个例子中,test 就是 Hello 类的“私有方法”了。再次证实,Category这个东东真的很强大~
4.Object-C有多继承吗?没有的话用什么代替?cocoa 中全部的类都是NSObject 的子类
没有,用1.消息转发 2.delegate和protocol 3.类别
答案:category和extensions的不一样在于后者能够添加属性。另外后者添加的方法是必需要实现的。
extensions能够认为是一个私有的Category。
不一样之处在于:要添加额外方法,分类必须在第一个@interface中声明方法,而且在@implementation中提供实现,否则运行时出错。而类扩展,你添加的方法是一个required API,若是不去实现,编译器会警告,并且这个方法的声明能够不在第一个@interface中去声明。
答: 管理方式:对于栈来说,是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放工做由程序员控制,容易产生memory leak。
九、数组和链表什么区别?
答: 数组是将元素在内存中连续存放,因为每一个元素占用内存相同,能够经过下标迅速访问数组中任何元素。
链表刚好相反,链表中的元素在内存中不是顺序存储的,而是经过存在元素中的指针联系到一块儿。
十、delegate和notification什么区别,什么状况使用?
delegate 一对一
notification 一对多
delegate的命名要准确,尽可能看名字就知道用法。delegate和通知有的用法有些象,可是前者是单对单的,后者是单对多的状况。
11
assign: 简单赋值,不更改索引计数
copy: 创建一个索引计数为1的对象,而后释放旧对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提升输入对象的索引计数为1
12.两个controller传值,
通常的传值使用简单的赋值,
你能够在B里面声明一个属性,在A里面建立B的时候,将B的属性赋值便可
若当异步操做(通常耗时的或网络请求用异步)时,能够用一下方法,, 或 block
想到四个途径:
1)使用代理
2)使用通知notification
3)使用NSUserdefault
4)使用全局变量,如在appdelegate里面定义一个变量用于传值
NSNotification
我的以为用这个东西在不一样的viewcontroller间传东西很方便的
发消息
[[NSNotificationCenter defaultCenter] postNotificationName:@"popView"/*消息名字,在添加监听时会用到*/ object:@"ShowHomeLineViewController"/*传的参数,多个参数就能够用数组啦*/];
收消息
一、添加监听:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(Show:)/*收到消息后的响应函数*/ name:@"popView"/*消息名字,在发消息时 指定的*/ object:nil];
二、消息处理(实现前面的Show:函数)
-(void)Show:(NSNotification*)notification
{
NSString* str = (NSString*)[notification object];//这里取出刚刚从过来的字符串
}
三、不要忘记移除监听
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"popView" object:nil];
十一、同步请求和异步请求什么区别?
答: 发送同步请求,程序将中止用户交互,直至服务器返回数据完成,才能够进行下一步操做,
异步请求不会阻塞主线程,而会创建一个新的线程来操做,用户发出异步请求后,依然能够对UI进行操做,程序能够继续运行。
十二、iOS中的多线程操做、多线程方式
iOS 提供了方便的多线程调用机制: NSOperation 和 NSOperationQueue 。它的使用方法也很简单,
通常都是将NSOperation对象加入到NSOperationQueue队列中,加入后队列就开始处理,知道任务操做完成。
1三、UIViewController的生命周期
答: 当一个视图控制器被建立,并在屏幕上显示的时候。 代码的执行顺序
// 视图显示在屏幕上的顺序
一、 alloc 建立对象,分配空间。
二、init (initWithNibName) 初始化对象,初始化数据。
三、loadView 从nib载入视图, 这一步不须要去干涉。除非没有使用xib文件建立视图。
四、viewDidLoad 加载完毕,能够进行自定义数据以及动态建立其余控件。
五、viewWillAppear 视图将出如今屏幕以前,立刻这个视图即将显示在屏幕上。
六、viewDidAppear 视图已在屏幕上渲染完成。
// 视图将被从屏幕上移除的顺序
一、viewWillDisappear 视图将被从屏幕上移除以前执行。
二、viewDidDisappear 视图已经被从屏幕上移除。
三、dealloc 视图被销毁,此时须要在init和viewDidLoad中建立的对象进行释放。
四、viewDidUnload 出现内存警告在内存不足时执行,并对全部非当前显示的controller执行。
在iOS6中,viewDidUnload回调方法被Deprecated掉了。查看苹果的文档,能够看到以下的说明。
dealloc方法
viewDidUnload和dealloc方法没有关联,dealloc仍是继续作它该作的事情
看到如下的代码
- (void)viewDidUnload {
self.detailViewController = nil;
self.languageNames = nil;
self.languageCodes = nil;
}
- (void)dealloc {
[detailViewController release];
[languageNames release];
[languageCodes release];
[super dealloc];
}
若是是先调用viewDidUnload后再调用dealloc, 那么languageNames都已是nil了,再掉release有什么意义呢?
缘由彷佛是,对一个viewcontroller来讲,它的数据的初始化在init中,而它管理的view采用了lazy load的方式,也就是有须要的时候才会载入,因此跟view相关的数据能够在viewDidLoad(也就是在view被载入的时候)进行初始化。当内存紧张的时候, ios会销毁点一些view,经过调用viewDidUnload (里面通常也只是把跟view相关的数据设为nil), 但这个时候viewcontroller自己还在,因此它的dealloc不会被调用,除非是到了viewcontroller也被销毁的时候
1四、iOS数据持久化方式
答: 四种:属性列表、对象归档、SQLite3和Core Data
15.实例方法跟类方法
16.weak strong retain
17.Object C中建立线程的方法是什么?若是在主线程中执行代码,方法是什么?若是想延时执行代码、方法又是什么?
答: 线程建立有三种方法:使用NSThread建立、使用 GCD的dispatch、使用子类化的NSOperation,而后将其加入NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,若是想延时执行代码能够用performSelector:onThread:withObject:waitUntilDone:
18.
19. 单件实例是什么
答: Foundation 和 Application Kit 框架中的一些类只容许建立单件对象,即这些类在当前进程中的惟一实例。
举例:NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。
当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,若是该实例还不存在,则首先进行实例的分配 和初始化。
27.类别的做用?继承和类别在实现中有何区别?
答: category 能够在不获悉,不改变原来代码的状况下往里面添加新的方法,只能添加,不能删除修改。
而且若是类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,由于类别具备更高的优先级。 类别主要有3个做用:
(1)将类的实现分散到多个不一样文件或多个不一样框架中。
(2)建立对私有方法的前向引用。
(3)向对象添加非正式协议。
继承能够增长,修改或者删除方法,而且能够增长属性。
28.类别和类扩展的区别。
答: category和extensions的不一样在于 后者能够添加属性。另外后者添加的方法是必需要实现的。 extensions能够认为是一个私有的Category。
29.29.KVO and KVC?
20.代理的做用
答: 代理的目的是改变或传递控制链。容许一个类在某些特定时刻通知到其余类,而不须要获取到那些类的指针。能够减小框架复杂度。 另一点,代理能够理解为java中的回调监听机制的一种相似。
32.frame和bounds有什么不一样?
答: frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统) bounds指的是:该view在自己坐标系统中 的位置和大小。(参照点是自己坐标系统)
35.
进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。进程有独立的地
址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一
个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的
地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程
序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进
行而且又要共享某些变量的并发操做,只能用线程,不能用进程。
36.
为何不少内置的类,如TableViewController的delegate的属性是assign不是retain?
循环引用 全部的引用计数系统,都存在循环应用的问题。例以下面的引用关系: • 对象a建立并引用到了对象b. • 对象b建立并引用到了对象c. • 对象c建立并引用到了对象b. 这时候b和c的引用计数分别是2和1。当a再也不使用b,调用release释放对b的全部权,由于c还引用了b,因此b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。今后,b和c永远留在内存中。 这种状况,必须打断循环引用,经过其余规则来维护引用关系。好比,咱们常见的delegate每每是assign方式的属性而不是retain方式 的属性,赋值不会增长引用计数,就是为了防止delegation两端产生没必要要的循环引用。若是一个UITableViewController 对象a经过retain获取了UITableView对象b的全部权,这个UITableView对象b的delegate又是a, 若是这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。本身在设计使用delegate模式时,也要注意这点。