1. Difference between shallow copy and deep copy?
浅复制和深复制的区别?
浅复制:两个实例的指针仍指向内存中的同一资源,只复制指针值而不是实际资源;
深复制:不仅复制指针值,还复制指向指针所指向的资源。
2. NSString的时候用copy和strong的区别是什么?
copy修饰的NSString,在初始化时,如果来源是NSMutableString的话,会对来源进行一次深拷贝,将来源的内存地址复制一份,这样,两个对象就一点关系就没有了,无论你怎么操作来源,都不会对自己的NSString有任何影响
当你给你的的NSString对象赋值时,如果来源是NSMutableString,那么这种情况就必须要用copy;如果你确定来源是不可变类型的,比如@"http://www.jianshu.com/users/691d9ed740cf/latest_articles"这种固定的字符串,那么用strong比较好
3. NSString的时候用copy和retain的区别是什么?
retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,
引用计数每次加一。始终返回一个不可变对象。
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。
4. NSString的时候用strong和retain, weak和assign的区别是什么?
strong weak是ARC引入的,strong相当于retain,但是对于有的类型,例如NSString,则使用strong相当于使用copy
这样直接用strong就可以直接处理retain和strong的情况了。
weak相当于assign,但是比后者多一点:对象被干掉时会将weak引用设为nil,而对nil发送消息都不会导致崩溃,否则weak引用为野指针,会出现问题
5. _block和_weak修饰符的区别是什么?
__block对象在block中是可以被修改、重新赋值的。
__block对象在block中不会被block强引用一次,从而不会出现循环引用问题。
__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
__block对象可以在block中被重新赋值,__weak不可以
6. 谈谈Object-C的内存管理方式及过程?
1).当使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当不再使用该对象时,要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.
2).当通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,不需要执行任何操作来确保该对象被清理.如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它.
3).如果保留了某个对象,需要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.
如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥 有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也同样适用.
如果您拷贝一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放.
如果您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。
如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该释放它(这个规则有少数 的例外,在参考文档中有显式的说明)。
7. 内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
8. ARC与MRC的内存管理机制有什么区别?
1> 每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁
2> 通过retain可以让对象的计数器+1、release可以让对象的计数器-1
3> 还可以通过autorelease pool管理内存
4> 如果用ARC,编译器会自动生成管理内存的代码
9. 内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
10. static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
static修饰的函数是一个内部函数,只能在本文件中调用,其他文件不能调用
static修饰的全部变量是一个内部变量,只能在本文件中使用,其他文件不能使用
static修饰的局部变量只会初始化一次,并且在程序退出时才会回收内存
11. Objective-C堆和栈的区别?
栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等,栈是向低地址扩展的数据结构,是一块连续的内存的区域。即栈顶的地址和栈的最大容量是系统预先规定好的。堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收,向高地址扩展的数据结构,是不连续的内存区域,从而堆获得的空间比较灵活。
12. Object-c的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类好?为什么?
Objective-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理 来实现的。
13. What is purpose of delegates?
代理的作用?
代理的目的是改变或传递控制链。
允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
另外一点,代理可以理解为java中的回调监听机制的一种类似。
14. What is advantage of categories? What is difference between implementing a category and inheritance?
类别的作用?继承和类别在实现中有何区别?
category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。 并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。 继承可以增加,修改或者删除方法,并且可以增加属性。
15. Difference between categories and extensions?
类别和类扩展的区别。
extensions可以添加属性。但添加的方法是必须要实现的。
extensions可以认为是一个私有的Category。
16. Difference between protocol in objective c and interfaces in java?
obc中的协议和java中的接口概念有何不同?
OBC中的代理有formal和informal protocol,正式协议和非正式协议。正式协议和Java。接口一样。
非正式协议中的方法属于设计模式,不是必须实现的,但是如果有实现,就会改变类的属性。
非正式协议使用interface修饰,“必须实现(@required)”和“可选实现(@optional)”。
17. What are KVO and KVC?
KVC是键值编码,特点是通过指定表示要访问的属性名字的字符串标识符,可以进行类的属性读取和设置
KVO是键值观察,特点是利用键值观察可以注册成为一个对象的观察者,在该对象的某个属性变化时收到通知
对于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方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。
18. property属性有哪些,并说明下应用场景?
1> readwrite:同时生成get方法和set方法的声明和实现
2> readonly:只生成get方法的声明和实现
3> assign:set方法的实现是直接赋值,用于基本数据类型
4> retain:set方法的实现是release旧值,retain新值,用于OC对象类型
5> copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型
6> nonatomic:非原子性,set方法的实现不加锁(比atomic性能高)
19. Http的post和get 有什么区别?
使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器,使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器
20. What are mutable and immutable types in Objective C?
obc中可修改和不可以修改类型。
可动态添加修改和不可动态添加修改
比如NSArray和NSMutableArray。
前者在初始化后的内存控件就是固定不可变的,
后者可以添加等,可以动态申请新的内存空间。
21. When we call objective c is runtime language what does it mean?
我们说的obc是动态运行时语言是什么意思?
多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
运行时和多态:
运行时:运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力。
(意思就是假设生物类(life)都用有一个相同的方法-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。 也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。)
运行时机制是多态的基础。
22. what is difference between NSNotification and protocol?
通知和协议的不同之处?
协议有控制链(has-a)的关系,通知没有。
通知的话,它可以一对多,一条消息可以发送给多个消息接受者。
代理一般是一对一。
23. What is push notification?
什么是推送消息?
通过标准 TCP/IP 网络直接向移动设备发送消息。
24. Polymorphism?
关于多态性
多态,子类指针可以赋值给父类
继承和封装?
多继承:对象多态(属性、方法)
Protocol、Category (extension:匿名Category)
类别:只能增加一些接口
高级实现:Category + Runtime、组合方式等
25. 请谈谈您对单例的认识。
单例模式常用在只需要一个实例的类的情况下,即这个类只能有一个实例对象。单例模式可以减少内存资源的浪费,而且方便外界的访问。单例模式保证一个类仅有一个实例,并且提供一个访问它的全局访问点
单例能节省内部资源,实现数据共享。
+(ViewController *)shareinstance{
static viewcontroller *instance = nill;
if(instance = nill){
instance = [viewcontroller alloc] init];
}
return instance;
}
单例的使用场合
类中没有可以修改的成员变量(这个类没有状态),如果存在可以修改的成员变量会产生线程安全问题,除非加上synchronized 关键字,不建议使用,单例模式无法继承,所以无法扩展,无法更改它的实现。如果读取配置文件比较适合使用单例。
1.创建时需要消耗大量内存
2.需要频繁创建,调用
3.数据共享
(//饿汉式,一开始就加载
private static UserManager userManager=new UserManager();
private UserManager(){}
public static UserManager getInstance()
{
return userManager;
}
//懒汉式,延迟加载,用到时才加载,节约资源
private static UserManager userManager=null;
private UserManager(){}
public static synchronized UserManager getInstance()
{
if(userManager==null)
{
userManager=new UserManager();
}
return userManager;
})
26. 系统单例有哪些?
UIApplication(应用程序实例)
NSNotificationCenter(消息中心):
NSFileManager(文件管理):
NSUserDefaults(应用程序设置):
NSURLCache(请求缓存):
NSHTTPCookieStorage(应用程序cookies池):
27. UIResponder和UIControl有什么不同?
UIResponder类:上承NSObject,下接UIView ,UIVIewController ,UIApplacation;响应点,压,滑;
主要是响应某个动作,执行某个行为--
-(void) touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event;
UIControl类:上承UIView,下接UIButton等开关按钮;
在继承了UIResponder的属性基础上,还能够相应某个动作,为某个对象,添加动作-
-(void) addTarget:(id)target action:(SEL)action forControlEvents(UIControlEvents)controlEvents
28. 视图顺序
Init、loadView、ViewDidLoad、viewwillappear、viewdidappear、viewwilldisappear、viewDidUnload、dealloc
29. What is responder chain?
说说响应链 如button点击事件,系统是怎么找到那个button的
事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。 可以说点事件的分发,传递以及处理。
UIApplication --> UIWindow --> ViewController-->subViews -->递归找到最适合处理事件的控件
30. Difference between frame and bounds?
frame和bounds有什么不同?
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
31. Difference between method and selector?
方法和选择器有何不同?
selector是一个方法的名字,
method是一个组合体,包含了名字和实现.
32. id 声明的对象有什么特性?
id是可以指向任何类型的指针或者可以理解为指向任何未知类型的指针。
33. What is lazy loading?
懒汉模式,只在用到的时候才去初始化。 也可以理解成延时加载。
比如tableView中图片的加载显示了。 一个延时载,避免内存过高,一个异步加载,避免线程堵塞。
34. 线程与进程的区别和联系?
进程和线程都是由操作系统所体会的程序运行的基本 单元,系统利用该基本单元实现系统对应用的并发性。
程和线程的主要差别在于它们是不同的操作系统资源 管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变 量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一 些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
35. 什么是Notification?什么时候用delegate,什么时候用Notification?
观察者模式,controller向defaultNotificationCenter添加自己的notification,其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也可以在添加观察者中设定反映时间,取消观察需要在viewDidUnload 跟dealloc中都要注销)。
delegate针对one-to-one关系,并且reciever可以返回值给sender,notification 可以针对one-to-one/many/none,reciever无法返回值给sender.所以,delegate用于sender希望接受到reciever的某个功能反馈值,notification用于通知多个object某个事件
36. 交换两个变量的值,不使用第三个变量
a = a + b; b = a – b; a = a – b;
a = a ^ b; b = a ^ b; a = a ^ b;
37. 子线程怎么刷新UI
perform:selector:OnMainThread:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_async(dispatch_get_main_queue(), ^{ }); });