1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
2. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?
答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。
3. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?
答:
1). readwrite 是可读可写特性;需要生成getter方法和setter方法时使用
2). readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变
3). assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
4). retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
5). copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。(深拷贝:新的对象和新的指针,浅拷贝:新的指针指向相同的一个对象)
6).nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic,性能好.
5.对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象?
答:编译时NSString,运行时确定他真实的类型:NSData.
6.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int.
答:object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,而C语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;NSInteger是基本数据类型,并不是NSNumber的子类,当然也不是NSObject的子类。NSInteger是基本数据类型Int或者Long的别名(NSInteger的定义typedef long NSInteger),它的区别在于,NSInteger会根据系统是32位还是64位来决定是本身是int还是Long。
7.id 声明的对象有什么特性?
答:具有运行时特性,即可以指向任意类型的objcetive-c的对象.
8.Objective-C如何对内存管理的,说说你的看法和解决方法?
答:ARC(自动引用计数), MRC(手动引用计数)
手动引用计数:谁创建谁释放的,谁retain/copy,谁release.
系统自动计数,在创建和销毁的时候分别retain,release,引用计数为0的对象放入自动释放池,释放自动释放池的时候销毁池中所有的对象.
9. 原子(atomic)跟非原子(non-atomic)属性有什么区别?
答:atomic提供多线程安全,防止在写入数据未完成的时候被另外的线程访问,造成数据错误.nonatomic在自己管理的内存环境中,解析访问器保留并自动释放返回的值,只简单的返回这个值
10. 内存管理的几条原则是什么?按照默认法则.哪些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
答:原则:谁申请,谁释放.
内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。关键字alloc 或new 生成的对象需要手动释放;设置正确的property属性,对于retain需要在合适的地方释放,
11.如何对iOS设备进行性能测试?
答:Profile-> Instruments ->Time Profiler 进行性能测试
12. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
答:
线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:
13. MVC设计模式是什么? 你还熟悉什么设计模式?
答:
设计模式:并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。面向对象编程中,java已经归纳了23种设计模式。
mvc设计模式 :模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,界面的显示,业务逻辑的控制。 iphone本身的设计思想就是遵循mvc设计模式。其不属于23种设计模式范畴。
代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到广泛应用.
单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplication sharedApplication];任何地方调用都可以得到 UIApplication的对象,这个对象是全局唯一的。
观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。
15 浅复制和深复制的区别?
答:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源
还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
16. 类别的作用?继承和类别在实现中有何区别?
答:category可以再不获悉,不修改原有类的前提下给该类添加方法,只能添加,不能修改或者删除,category比原有类有更高的优先级.
category的主要三个作用:
1>将类的实现分散到不同的文件或者框架中.
2>创建对私有方法的前向引用
3>向对象添加非正式协议.
继承可以增加,修改或者删除方法,并且可以增加属性。
17. 类别和类扩展的区别。
答:category可以添加方法不能添加属性.类扩展可以添加属性且类扩展添加的方法是必须实现的.
18. 什么是KVO和KVC?
答:
1>KVO键值监听:提供了观察某一个属性的改变,简化程序代码.
对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
对于kvc机制如何通过key寻找到value:
“当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。1>首先查找对象是否带有 someKey 这个方法,2>如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,3>程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,4>程序会抛出一个NSUndefinedKeyException异常错误。
(cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求<补救>
2>KVC键值编码:是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制,很多情况下可以简化程序代码。但是编译器不会对错误给出提示.
19. 代理的作用?
答:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。另外一点,代理可以理解为java中的回调监听机制的一种类似。
20. oc中可修改和不可以修改类型。
答:答:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。比如NSArray和NSMutableArray。前者在初始化后的内存空间就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。
21. 我们说的oc是动态运行时语言是什么意思?
答:答:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。
因此也可以说,运行时机制是多态的基础.
22. 通知和协议的不同之处?
答:简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。
23. 关于多态性
答:多态,子类指针可以赋值给父类。不同对象以自己的方式响应相同的消息的能力叫做多态.
24. 对于单例的理解.
答:在objective-c中要实现一个单例类,至少需要做以下四个步骤:
1).为单例对象实现一个静态实例,并初始化,然后设置成nil,
2).实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
3).重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
4).适当实现allocWitheZone,copyWithZone,release和autorelease。
25. 说说响应链.
答: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播.(事件的分发,传递以及处理方向去回答)
26. frame和bounds有什么不同?
答:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统).bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
27. 方法和选择器有何不同?
答:selector是一个方法的名字,method是一个组合体,包含了方法的名字和实现
28. OC的垃圾回收机制?
答: OC2.0有Garbage collection,但是iOS平台不提供。一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。
29. NSOperation queue?
答:存放NSOperation的集合类。<用途事例待添加>
30. 什么是延迟加载?
答:懒加载,用到时候在加载,只会加载一次.
31. 在应用中可以创建多少autorelease对象,是否有限制?
答:没有限制.
32. 如果我们不创建内存池,是否有内存池提供给我们?
答:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池
网友评论