1、简答题c++
一、Objective-C的类能够多重继承么?能够采用多个协议么?设计模式
不能够多重继承,能够采用多个协议。数组
二、#import和#include的区别是什么?#import<> 跟 #import""有什么区别?框架
1.
使用include要注意重复引用的问题:性能
class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。测试
2. #import肯定一个文件只能被导入一次,这使你在递归包含中不会出现问题。编码
因此,#import比起#include的好处就是它避免了重复引用的问题。因此在OC中咱们基本用的都是import。spa
#import<> 包含iOS框架类库里的类,#import""包含项目里自定义的类。
三、Category是什么?扩展一个类的方式用继承好仍是类目好?为何?
四、延展是什么?做用是什么?
五、类实例(成员)变量的@protected ,@private,@public声明各有什么含义?
@protected:受保护的,该实例变量只能在该类和其子类内访问,其余类内不能访问。
@private:私有的,该实例变量只能在该类内访问,其余类内不能访问。
@public:共有的,该实例变量谁均可以访问。
六、id声明的对象有什么特性?
Ø
Ø
Ø
Ø
Ø
七、委托是什么?委托和委托方双方的property声明用什么属性?为何?
委托:一个对象保存另一个对象的引用,被引用的对象实现了事先肯定的协议,该协议用于将引用对象中的变化通知给被引用对象。
为了不循环引用形成的内存泄露。
八、浅拷贝和深拷贝区别是什么?
深层复制:复制引用对象自己。
意思就是说我有个A对象,复制一份后获得A_copy对象后,对于浅复制来讲,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象自己资源仍是只有一份,那若是咱们对A_copy执行了修改操做,那么发现A引用的对象一样被修改,这其实违背了咱们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象自己。
用网上一哥们通俗的话将就是:
浅复制比如你和你的影子,你完蛋,你的影子也完蛋
深复制比如你和你的克隆人,你完蛋,你的克隆人还活着。
九、内存管理的几条原则是什么?按照默认法则,哪些关键字生成的对象须要手动释放?哪些状况下不须要手动释放,会直接进入自动释放池?
•
•
•
使用new、alloc、copy关键字生成的对象和retain了的对象须要手动释放。设置为autorelease的对象不须要手动释放,会直接进入自动释放池。
十、怎样实现一个单例模式的类,给出思路,不写代码。
•
•
•
•
•
•
十一、@class的做用是什么?
•
•
•
十二、KVC是什么?KVO是什么?有什么特色?
•
•
1三、MVC是什么?有什么特性?
–
–
–
–
1四、定义属性时,什么状况使用copy、assign、retain?
使用assign:对基础数据类型(NSInteger,CGFloat)和C数据类型(int, float, double, char,等等)
使用copy:但愿得到源对象的副本而不改变源对象内容时,对NSString
使用retain:但愿得到源对象的全部权时,对其余NSObject和其子类
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,只是必定字节的内存空间,用于存放数值;而object-c的NSNumber包含有父类NSObject的方法和NSNumber本身的方法,能够完成复杂的操做。
7.id 声明的对象有什么特性?
Id 声明的对象具备运行时的特性,便可以指向任意类型的objcetive-c的对象;
8.Objective-C如何对内存管理的,说说你的见解和解决方法?
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
9.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象
须要手动释放?在和property结合的时候怎样有效的避免内存泄露?
谁申请,谁释放
遵循Cocoa Touch的使用原则;
内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”须要注意@property设置特性时,必定要用对特性关键字,对于“内存泄漏”,必定要申请了要负责释放,要细心。
关键字alloc 或new 生成的对象须要手动释放;
设置正确的property属性,对于retain须要在合适的地方释放,
10.如何对iOS设备进行性能测试?
Profile-> Instruments ->Time Profiler
11.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为何?
=======================================================
NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[strretain];
[aryaddObject:str];
NSLog(@"%@%d",str,[str retainCount]);
[strretain];
[strrelease];
[strrelease];
NSLog(@"%@%d",str,[str retainCount]);
[aryremoveAllObjects];
NSLog(@"%@%d",str,[str retainCount]);
=======================================================
str的retainCount建立+1,retain+1,加入数组自动+1
3
retain+1,release-1,release-1
2
数组删除全部对象,全部数组内的对象自动-1
1
12. Object C中建立线程的方法是什么?若是在主线程中执行代码,方法是什么?若是想延时执行代码、方法又是什么?
线程建立有三种方法:使用NSThread建立、使用GCD的dispatch、使用子类化的NSOperation,而后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,若是想延时执行代码能够用performSelector:onThread:withObject:waitUntilDone:
13.描述一下iOS SDK中如何实现MVC的开发模式
MVC是模型、试图、控制开发模式,对于iOS SDK,全部的View都是视图层的,它应该独立于模型层,由视图控制层来控制。全部的用户数据都是模型层,它应该独立于视图。全部的ViewController都是控制层,由它负责控制视图,访问模型数据。
静态区 常量区 代码区 堆 栈