1.OC的类可以多重继承吗?可以实现多个接口吗?要想实现类似多重继承如何实现?
答:OC不可以实现多重继承。可以实现多接口。可用运行时实现。
2.#import 跟#include有什么区别。@class呢?#import<>和#import""又有什么区别?
答:使用#import头文件只包含一次,不会重发包含。@class只是告诉编译器某个类的申明。可以解决头文件的互相包含的问题。#import<>引入的是系统的头文件。#import""引入的是自定义的文件的头文件。当然了如果你用了cocopod的话,三方的头文件也是用#import<>,没用cocopod的三方头文件则是#import""。(原因请参考:)
3.对于语句NSString *obj = [[NSData alloc]init];obj在编译时和运行时分别是什么类型的对象。
答:编译时是NSString的类型,运行时是NSData类型的对象。
4.id 申明的对象有什么特性?
答:id申明的对象具有运行时的特性,即可指向任意类型的oc对象。
5.OC内层管理有哪些方式?开发实例?内存管理的原则,哪些关键字生成的对象需要手动释放?在和property结合的时候怎么有效的避免内存泄露?
答:OC的内层管理方式:OC利用引用计数管理内层。ARC(自动引用计数) 、MRC(手动引用计数)和自动释放池三种方式 。ARC是建立了在MRC的基础是的.Xcode5之后用的就是ARC了。alloc/retain/new/一个对像加到父视图上时,该对象的引用计数都会加1,release/autorelease/从父视图上移除该对象引用计数都会减1;内存管理遵循谁申请,谁释放的原则,mrc下内存管理主要避免“过早释放”和“内存泄露”,对于过早释放需要注意@property设置特性时属性的属性关键字。关键字alloc/new生成的对象需要手动释放,对于retain的对象需要在合适的地方释放;
6.如何对iOS设备进行性能测试?
答:1.common+i 可以调用xcode自带的测内层泄露的工具。2.profile->instrument->Timer profiler 也可以调用系统的工具,侧内层泄露和线程运行时间等。3.xcode自己可以自己监测项目内层、cpu占用情况,程序运行时,点击xcode左边栏的水波纹状的按钮,一个页面一个页面的进入退出操作,查看内层增减情况是否正常。4.还有一线自动化测试软件(由测试部门使用的)
7.什么是MVC模式?你还熟悉哪些设计模式?
答:MVC是一种设计模式。View 视图层。Model层进行数据的存储或处理的。Controller视图控制层,控制视图和model之间的数据交互及业务逻辑的控制。iphone本身的设计思想就是遵循mvc设计模式的。
代理模式:代理模式给某个对象提供一个代理对象,并由代理对象控制对源对象的引用。比如一个工厂生产了产品,并不想直接卖给用户,而是搞了很多的代理商,用户可以直接找代理商购买东西,代理商从工厂进货。常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到广泛的应用。
单例模式:一个类不是每次都通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个全局的对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplication shareApplication];任何地方调用都可以得到UIApplication,这个对象是全局唯一的。
观察者模式:当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生变化,就会调用遍历所有的观察者的对象调用观察者的方法从而达到通知观察者的目的。
单例模式:单例模式就是传入需要创建类型对象的一些属性,返回一个对象且已包含了这些属性参数的便利构造器的类方法。
8.浅复制和深复制的区别?
答:浅拷贝:只复制指向对象的指针。这样就产生了一个新的指针指向这个对象,这个对象销毁后两个指针都应该置空。
深拷贝:复制引用对象本身。也就是说产生一个新的对象,那么就有两个指针分别指向两个对象。当一个对象改变或者销毁后拷贝出来的新对象不受影响。@property (nonatomic,copy)是深拷贝。深拷贝需要实现NSCoying协议,实现-(id)copyWithZone:(NSZone*)zone 方法。当对一个@property属性含有修饰符的时候,在进行复制操作的时候实际上是调用了这个方法。
9.category(类别)的作用?继承和类别在现实中有何区别?
答:category可以在不知道源码和不改变源码的情况下往类里面添加新的方法。项目拥有更好的封装性。如果类别和原类的方法发生了冲突,测类别方法会覆盖原类方法,因为类别具有更高的优先级。比如我们:添加推送、环信注册appkey、分享注册的时候一般都写在写在分类里面。
继承:可以修改、添加父类的方法。一般我们搭建项目框架的时候都会建一个基类,把一些常用的方法,属性写在里面,例如:左右按钮、当前的页数等。
10.category和extension的区别?
答:category和extension的不同在于 后者可以添加属性,后者添加的方法是必须实现的。
11.线程是什么?进程是什么?线程和进程的区别和联系?
答:参考线程和进程的讲解 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。而线程是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费的资源较大,效率要低一些。对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
12.堆和栈的区别?
答:管理方式:对于栈来讲,是由编译器自动管理;堆是程序员控制,容易产生内层碎片。
栈:向低地址扩展的数据结构,是连续的内层区域。栈顶和栈底的最大容量是系统预先规定好的(是一个编译时就确定的常数1M或者2M),站的空间较小。先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出。
堆:向高地址扩展的数据结构。系统是用链表来存储的空闲内存地址的,自然不是连续的;链表的遍历方向是由低地址向高地址。对的大小受限于系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。频繁的new/delect/alloc势必会造成内存空间的不连续,从而造成大量的碎片,先进先出
分配方式:堆是动态分配的,栈有2种分配方式:静态分配和动态分配。静态分配是由编译器完成的,比如局部变量的分配,动态分配由alloca函数分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手动实现。
分配效率:栈是系统提供的数据结构,计算机会在底层对栈提供支持;分配专门的寄存器存放栈的地址,压栈出栈都是专门的指令执行,这就决定了栈的效率比较高。堆是c/c++函数提供的,它的机制是很复杂的。
14.tableview的重用机制?
答:xcode的UITableView文件中,有NSMutableArray*visiableCells,和NSMutableDictionary*reusableTableCells两个属性,visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。TableView显示之初,reusableTableCells为空,那么tableView dequeueReusableCellWithIdentifier返回nil,开始的cell都是通过[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIndentifier:CellIndentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数次数。
比如:有100条数据,iphone一屏最多显示10个cell,程序最开始显示TableView的情况:
1>.用[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10个cell,并给cell指定同样的重用标示(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusebleTableCells为空。
2>.向下拖动tableView,当cell完全移出屏幕,并且cell 11(它也是alloc出来的,原因同上)完全显示出来的时候。cell 11加入到visiableCells,cell 1移出visibleCells,cell加入到reusableTableViewCells.
3>.接着向下拖动tableview,因为reuseableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候tableview dequeueReuseableCellWithIdentifier:CellIdentifier,返回cell.cell 1加入到visibleCells,cell 1移出reusableTableCells;cell2移出visibleCells,cell2加入到reasableTableCells.之后再需要显示的cell就可以正常使用。
15.kvo、notification、 delegate及block的去别,分别在什么情况下使用?
答:kvo是观察者模式,一般同KVC搭配使用,通过KVO可以检测一个值的变化,比如view的高度变化,是一对多的关系,一个值得变化会通知所有的观察者。
Notification通知,也是一对多的使用场景。在某些情况下,kvo和NSNotification是一样的,都是状态改变之后告知对方。NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来响应,比kvo多了发送通知的一步,但是其优点是监听不局限与属性的变化。相对于delegate消息的发送者和接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通知并不关注结果。
delegate就是把自己想要做的是给被人来做。关注事情的结果。消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和和接收者的关系是一对一的关系。
block多用于回调场景。
1>.效率肯定是delegate比NSNotification高。
2>.delegate方法比notification更直接,最典型的特征是,delegate方法往往需要关注返回值(delegate方法的结果)
16.属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在那种情况下使用?
assign:指定setter方法用简单的赋值,数据类型。
retain:对象类型。
copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内层来放置它。
readonly:将生成getter方法,而不生成setter方法。(getter方法没有get前缀)。
readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。
atomic:对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。线程是安全的但是执行效率低。
Nonatomic:非原子性的,不需要考虑线程的安全,执行效率高。
17.父类实现深拷贝时,子类如何实现深拷贝。父类没有实现深拷贝时,子类如何实现深拷贝。
1>.8题答案。
2>.父类实现深拷贝之后,子类只要重写copyWithZone方法,在方法内调用copyWithZone方法,
之后实现自己属性的处理。
3>.父类没有实现深拷贝,子类除了需要对自己的属性进行处理,还要对父类的属性进行处理。
18.将一个函数在主线程执行的4中方法。及几种方法的优缺点?及对多线程开发的理解?
1>. GCD方法,通过主线程队列发送一个Block块,使Block里面的方法可以在主线程中执行。 dispatch_async(dispatch_get_mian_queue)(),^{//需要执行的方法。});苹果推荐的方式本身简单、易用、易读,对于不复杂的线程的操作,会节省代码量,基于c的多线程创建方式,只需用不需要进行线程的开启和停止。因为苹果对其优化的好,但是操作没有NSOperation多。
2>.NSOperation方法,线程之间存在依赖关的。
NSOperationQueue *mainQueue = [NSOperaton mainQueue];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 需要执行的方法 }];
[mainQueue addOperation:operation];
3>.NSThread方法,轻量级,需要管理线程开启、睡眠、线程的生命周期、销毁、线程同步等。
[self performSelector:@selector(method) onThread[NSThread mainThread] withObject:nil waitUntilDone:YES model:nil];
[self performSelectorOnMainThread:@selecor(method) withObject:nil waitUntilDone:YES];
[NSThread mainThread]performSelector:@selector(method) withObject:nil];
4>.[RunLoop performSelector:@selector(method) withObject:nil];
多线程开发的理解:多线程开发可以提高cpu的利用率。
20.线程同步和异步的区别?iOS中如何实现多线程的同步?
答:线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 ,串行执行任务。线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制,并行执行任务 1.2.3模式。使用GCD的主队列.使用NSOperationQueue,把最大线程数(并发)设为1
20.如何让计时器调用一个类方法
1>.计时器只能调用实例方法,但是可以在这个实例方法里面调用静态方法。
2>.使用计时器一定要注意,计时器一定要加入Runloop中,并且选好model才能运行。scheduledTimerWithTimeInterval方法创建一个计时器加入到RunLoop中所以可以直接使用。
3>.如果计时器的repeat选择YES说明这个计时器会重复执行,一定要在合适的时机调用计时器的Invalid,不能在dealloc中调用,因为一旦设置为repeat为yes,计时器会强持有self,导致dealloc永远不会被调用,这个类就永远不会被释放。比如可以在viewDidDisappear中调用,这样当类需要被回收的时候就可以正常进入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
- (void)timerMethod { [[self class]staticMethod]; }
- (void)invalid{ [timer invalid]; timer = nil; }
21.写一个setter方法用于完成@property(nonatomic,retain)NSString *name,写一个setter方法用于完成@proprety(monoatomic,copy)NSString* name;
1>. - (void)setName:(NSString*)str { [name release]; name = [str retain]; }
2>.- (void)setName:(NSString*)str{ [name release]; name = [str copy]; }
22.写一MRC下的getter方法;(查看mrc的基础知识)
答:- (NSString*)name{ return [ [ _name retain]autorelease] ; }
22.常见的OC的数据类型有哪些,和c的基本数据类型有什么区别?NSInteger和int
答:co的数据类型NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class类型,创建之后便是对象,而c语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;NSInteger十基本的数据类型,并不是NSNumber的子类,当然也不是NSObject的子类,NSInteger十基本数据类型Int或者Long的别名(NSInteger的定义typedef long NSInteger),他的区别在于,NSInteger会根据系统是32位还是64位来决定本事是int还是long.
23.看看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢?为什么?
NSMutableArray *array = [[NSMutableArray array]retain];
NSString *str = [NSString stringWithFormat:@"test"];
[str retain];
[array addObject:str];
NSLog(@"%@ %d",str,[str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@"%@ %d",str,[str retainCount]);
[array removeAllObject];
NSLog(@"%@ %d",str ,[str retain count]);
str的retainCount创建+1,retain+1,假如数组自动+1 3
retain +1,release -1,release -1 2;
数组删除所有的对象,所用数组内的对象自动-1 1
24.我们说oc是动态运行时语言是什么意思?
答:多态。主要是把数据类型的确定由编译时推到了运行时,这个问题其实牵涉到两个慨念,运行时和多态。简单来说,运行时机制使得我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息能力叫多态。比如:继承同一父类的子类都可以调用父类的同一方法。因此可以说运行机制是多态的基础。
25.对于单例的理解?
答:在oc中,要实现一个单例,至少需要一下四个步聚:
1>.为单例对象实现一个静态实例,并初始化,然后设置为nil;
2>.实现一个实例便利构造方法检查上面申明的静态实例是否为nil,如果是测新建并返回一个本例的实例;
3,重写allocWithZone方法,用来保证他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例,
4.适当实现allocWithZone,copyWithZone,release和autorelease.
27.说说响应链
答:事件响应链。包括点击事件等,画面刷新事件等。在视图栈内从上至下,或者从下至上传播。这个可以结合自己的理解回答。
28.frame和bounds的区别?
答:frame值得是:该view在父view坐标系统中的位置和大小。(参考点是父视图的坐标系统)
bounds指的的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
29.方法和选择器有何不同?
答:selector是一个方法的名字。method是一个组合体,包含了名字和实现。
30.什么是延迟加载?
答:懒加载,只有用的时候才去初始化。即是延迟加载。例如tableview中图片的加载显示。一个延迟加载可以避免内存过高,一个异步加载,避免线程堵塞。
31.是否在一个视图控制器中嵌入两个tableview控制器?
答:一个制图控制只提供了一个view视图。当然如果不是我们定向思维的UIviewcontroller,而是宏观的表示试图控制者,那是我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController那样的感觉。
32.一个tableView是否可以关联两个不同的数据源?你怎么处理的?
答:首先我们可以从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。我们可以根据需求利用indexpath的section、row里设置cell分别来自于不同的数据源。
33.什么时候使用NSMutableArray,什么时候使用NSArray?
答:当数组在运行时,需要不但变化的,使用该数组NSMutableArray,当数组在初始化之后,便不再改变的,使用NSArray.需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。
34.给出委托方法的实例,并且说出UITableView的DataSource方法
答:CocoaTouch框架中用到了大量的委托,其中UITableViewDelegate就是委托的典型应用。是一个典型使用委托来实现适配器模式,其中UITableviewDelegate协议是目标,tableview是适配器,实现了UITableViewDelegate的对象,是被适配器,一般情况下该对象是UITableViewController.
UITableView的DataSource方法有: - (NSInteger)tableView:(UITableView*)tableView numberOfRowInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;
38.如果我们不创建内层池,是否有内存池给我们?
答:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建线程的内存池。
39.类NSObject的哪些方法精创被使用?
答:NSObject是OC的基类,其由NSObject类及一系列协议构成。其类方法alloc、class、description对象方法init,dealloc、-performSelector:withObjet:afterDelay:等精创使用。
40.什么是简便构造方法?
答:简便构造方法一般由CocoaTouch框架提供,NSNumber的+numberWithBool:+numberWithChar:+numberWithDouble:+numberWithFloat;+numberWithInt;
Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法,获得系统给我们创建好的对象,并且不需要手动释放。
41.如何使用xcode设计通用应用?
答:使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可以运行在任何设备上的,在controller层,根据iPhone和ipad(独有UISplitViewController)的不同特点选择不同的viewController对象,在View层,可根据现实要求,来设计,其中xib文件设计时,其设置其为universal.
42.UIView的动画效果有哪些?
答:有很多,如:UIViewAnimationOpationCurveEaseInOut UIViewAniamationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitonCurlUpUIViewAnimationOptionTransitionCurlDown
44.在iPhone应用中如何保存数据?
答:常用的保存数据方式:1.plist文件。2.[NSUserDefaults standardUserDefaults];3.通过web服务,保存在服务器上。4.通过归档NSCoder固话机制,将对象保存在文件中 5.通过Sqlite或者CoreData保存在文件数据库中。
45.sqlite,coreData,FMDB几种存储方式的异同点?
答:sqlite是轻量级的数据库,可以通过写sqlite语句,借用sqliteManage这种管理工具,实现数据的本地存储。coreData和FMDB都是对sqlite的封装,coreData是通过上下文来管理数据的的,可以存储对象。FMDB是数据库的管理框架。文件写入:永久的保存在磁盘中,只支持NSString,NSData,NSArray,NSDictionary.对象归档:就是给数据进行加密,确保数据的安全性,自定义的对象。
46.什么是NSManagedobjectContext?
答:NSManagedObjectContext对象负责应用和数据库之间的交互。
47.什么是谓词?
答:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。predicate = [NSPredicate predicateWithFormat:@"customerID == @%@",n]; a = [customers filteredArrayUsingPredicate:predicate];
48.谈谈对block的理解?并写出一个使用block执行UIView动画?
答:Block是可以获取其他函数局部变量的函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核CPU可直接处理Block指令)
[UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ //需要执行的操作 }];
49.写出上面上一题的Block的定义。(两个block嵌套)
答:typedef void(^animations)(void); typedef void(^completion)(Bool finished);
50.使用什么对象完成网络功能?
答:ASIHTTPRequest与NSURLConnection
51.简单介绍下NSURLConnection类和+sendSynchronousRequest:returningResponse:error:与-initWithRequest:delegate:两个方法的区别?
答:NSURLConnection主要用于网络访问,其中+sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而-initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。
52.多线程是什么
答:多线程是一个复杂的概念
53.对block的理解?
答:block的实现是基于指针和函数指针,申明一个block对象,(block是存放在栈区的通过拷贝一份放在堆区)对象属性设置为copy。__weak 防止重复引用。引用计数不加1,相当于直接赋值。 block里面改变block外面的变量,因为应用 __block会使该block多一个成员变量对应这个外部变量,在赋值block时会将方法外部中的变量值复制到内部的成员变量中,从而实现访问。
1>.使用block和使用delegate完成委托模式有什么优点?
首先要了解什么是委托模式,委托模式在iOS中大量使用,其在设计模式中是适配器模式中的对象适配器。OC中使用id类型指向一切对象,使委托模式更为简洁。了解委托模式的细节:
iOS设计模式--委托模式
使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;适配对象不再需要实现具体某个protocol,代码更为简洁。
2>.多线程与block
GCD与Block
使用dispatch_async系列方法,可以指定的方式执行block
GCD编程实例
dispatch_async( dispatch_queue_t queue,dispatch_block_t block );
功能:在指定的队列里面提交一个异步执行的block,不阻塞当前的线程,通过queue来控制block执行的线程。主线程执行前文定义的finishBlock对象dispatch_async(dispatch_get_main_queue(),^(void){ finishBlock(); });
54.OC有私有的方法吗?私有变量呢?
答:OC类里面的方法只有两种,静态方法和实例方法。可以有私有变量。
56.C和oc如何混用
1>.oc的编译处理后缀为m的文件时,可以识别OC和c的代码,处理mm文件可以识别oc,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不出现oc的代码,因为cpp只是cpp
2>.在mm文件中混用cpp直接使用即可,所以OC混cpp不是问题
3>.在cpp中混用OC其实就是使用OC编写的模块是我们想要的。
如果模块以函数实现,那么头文件要按c的格式申明函数,实现文件中,c++函数内部可以用oc,但后缀还是mm或m。
总结:只要cpp文件和cpp include的文件中不包含co的东西就可以用了,cpp混用oc的关键是使用接口,而不是直接使用现实代码,实际上cpp混用的是oc编译后的o文件,这个东西其实是无差别的,所以可以用。oc的编译支持cpp.
57.ViewController的didReceiveMemoryWarning怎么调用?
答:[supper didReceiveMemoryWarning];
60.用预处理指令#define申明一个常数,用以表示1年中有多少秒(忽略闰年问题)
答:#define SECONDS_PER_YEAR(60*60*24*365)UL UL(表示无符号长整型)
61.写一个“标准”宏MIN,这个宏输入两个参数并返回比较小的一个
答:#define MIN (A,B) ( (A) <= (B)?(A):(B) )
62.关键字const有什么含义?修饰类呢?static的作用,用于类呢?还有extern c的作用呢?
答:const意味着“只读” ,下面的声明都是什么意思?
const int a; int const a; 这两个的作用是一样,a是一个常整型数。
const int *a; a是一个指向常整形数的指针(也就是,整形是不可以修改的,但指针可以)。
int *const a ; a是一个指向整形数的常指针(也就是说,指针指向的整形数是可以修改的,但指针是不可修改的)
int const *a const;a是一个指向常整形数的常指针(也就是说,指针指向的整形数是不可修改的,同时指针也是不可修改的)
总结:1>.欲住址一个变量被修改,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再会再去修改它了;
2>.对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
3>.在一个函数申明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值。
4>.对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”;
63.关键字volatie有什么含意?并给出三个不同的例子。
答:一个定义为volatile的变量是说这个变量可能会被意想不到的改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次小心的重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1>.并行设备的硬件寄存器(如:状态寄存器) 2>.一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3>.多线程应用中被几个任务共享的变量。
64.一个参数既可以是const还可以是volatile吗?一个指针可以是volatile吗?解释为什么?
答:1>.是的。一个例子是只读的状态寄存器。它是volatile因为它可可能被意想不到的改变。它是const因为不应该试图去修改它。2>是的,尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
65.static关键字的作用?
答:1>.函数体内static变量的作用范围为该函数体,不同于auto变量,该函数的内存只被分配一次,因此其值在下次调用时维持上次的值;2>.在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问;3>.在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内;4>.在类中的static成员变量属于整个类拥有,对类的所有对象只有一份拷贝;5>.在类中的static成员函数属于真个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
66.列举几种进程的同步机制,并比较其优缺点。
答:原子操作、信号量机制、自旋锁、管程、会合,分布式系统。
67.进程之间通讯的途径
答:共享存储系统消息传递系统管道:以文件系统为基础。
68.进程死锁的原因
答:资源竞争及进程推进顺序非法。
69.死锁的4个必要条件
答:互斥,请求保存、不可剥夺、环路
70.死锁的处理
答:鸵鸟策略、预防策略、避免策略、检测与解除死锁
71.cocoa touch框架
答:iOS应用程序的基础cocoa Touch框架重用了许多mac系统的成熟模式,但是他更多的关注于触摸的接口和优化。
UIKit为你提供在iOS实现图形,事件驱动程序的基本工具,其建立在和Mac OS X中一样的Foundation框架上,包括文字处理,网络,字符串操作等。
cocoaTouch 具有和iPhone用户接口一致的特殊设计,有了UIKit,你可以使用iOS上的独有的图形接口控件,按钮,以及全屏视图的功能,你还可以使用加速仪和多点触摸手势来控制你的应用。
各色俱全的框架 除了UIKit外。cocoaTouch包含了创建世界一流iPhone应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问API以控制摄像头,或通过GPS获知当前位置。
CoacoaTouch 既包含只需要几行代码就可以完成全部任务的强大oc框架,也在需要时提供基础的c语言API来直接访问系统,这些框架包括:
Core Animation:通过Core Animation,你就可以通过基于组合独立图层的简单的编程模式来创建丰富的用户体验。
Core Audio:coreAudio是播放器,处理和录制音频的专业技术,能轻松的为你的应用程序添加强大的音频功能。
coreData:提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可以处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是Cocoa Touch中一小部分可用的框架:
音频框架:Core Audio,OpenAL,Media Library,AV Foundation
数据管理:CoreData,Sqlite;
图形和动画:Core Animation,OpenGL ES,Quartz 2D
网络:Bonjour,WebKit,BSD Sockets
用户应用:AddressBook,CoreLoction,Map kit,Store kit
72.极光的推送原理?
73.
74.UIImage初始化图片有几种方法,简述各自的优缺点?
答: 1>.UIImage *image = [UIImage imagedName:"test.png"]; 这个方法创建的图片是从缓存里面获取的,先在缓存里面查看,看是不是有这个图片,没有的话见图片添加到缓存在使用。有的话直接使用缓存里面。在程序中,如果这个图片要在多个地方使用的话,建议使用这个方法。缺点:一旦加入到缓存中就一直占用内存,不能被释放掉。
2>.读取本地图片路径 NSString *imagePath = [NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"]; [UIImage imageWithContentsOfFile:imagePath]; 从手机本地读取,比较第一种方式,这个是直接加载图片的,图片不需要的时候,可以release掉。所以建议在使用重复率低的地方使用这种方法。
3>.下面的这种方式会出现卡线程的情况,所以建议在子线程中操作 //imageWithData:data NSURL *url = [NSURL URLWithString:@"http://haichuan1.png"]; UIImage *image2 = [ UIImage imageWithData:[NSData dataWithContentsOfUrl:url]]; 需要注意的是:如果imageWithData:是同步网络请求,如果在主线程直接使用的话,会卡主线程,因此一般不会在主线程中使用,而是采用异步网络请求获得data的值。
75.提示UITableView性能的几点建议?
答:1>.使用懒加载,什么时候使用,什么时候初始化并开辟内存空间,减少内存的占用。2>.将以定义cell的高度存起来,不用每次都计算。3.cell的重用机制,给cell添加重用标示。4.尽量不要在cellForRow里面添加addSubView:5.滑动tableview加载图片时候会出现卡顿,因为使用sdwebimg开启了好几条子线程,消耗了大量的cpu资源。可以在tableview的代理滑动减速那个代理方法里面再加载图片。
76.内存的五个区?
答:全局区(静态区):初始化的全局变量和静态变量放在一个区域,未初始化的放在相邻的区域,程序运行结束后,有系统进行释放。
文字常量区:存放常量字符串,程序结束后有系统释放
77.自动释放池是什么,如何工作
答:当您想一个对象发送一个autorelease消息时,Cocoa就会将对象的一个引用放入到最新的自动释放池,它仍然是一个正当的对象,因此自动释放池定义的作用域内的其他对象可以向他发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
78.OC的优缺点。
答:优点:1>.Cateogies 2>.posing 3>.动态识别4>.指标计算5>.弹性讯息传递6>.不是一个过度复杂的c衍生语言7>.OC和c可以混编
缺点:1>不支援命名空间 2>.不支持运算重载3>.不支持多重继承4>.使用动态运行时类型,所用的方法都是函数调用,所以很多编译时优化方法都用不到(如内联函数等),性能低劣。
79.sprintf,strcpy,memcpy使用上有什么注意的地方?
答:sprintf是格式化函数。讲一段数据通过特定的格式,格式化到一个字符串缓冲区去。sprintf格式化的函数的长度不可控,有可能格式化的字符串会冲出缓冲区的大小,造成溢出。
strcpy是一个字符串拷贝的函数,他的函数原型为strcpy(char*dst,const char *src)将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志为‘\o’,由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。
memcpy是具备字符串拷贝功能的函数,这是一个内存拷贝的函数,它的函数原型为memcpy(char *dst,const char*src,unsigned int len);将长度为len的一段内存,从src拷贝到dat中去,这个函数的长度不可控。但是会有内存叠加的问题。
87.http和socket通讯的区别?
答:http是客户端用http协议进行请求,发送请求时需要封装http请求头,并绑定请求的数据,服务器一般为web服务器配合(当然也非绝对)。http请求方式为客户端主动发起请求,服务器才能响应,一次请求完毕后测断开连接,以节省资源。服务器不会主动给客户端响应(除非采取http长连接技术)。iPhone主要使用的类是NSUrlConnection.
scoket是客户端服务器直接使用socket"套接字"进行连接,并没有规定连接后断开,所以客户端和服务器端可以保持连接通道,双发都可以主动发送数据,一般在游戏开发或股票开发这种要求即时通讯很强并保持发送数据量比较大的场合使用,主要类型是CFSocketRef.
88.TCP和UDP的区别
答:TCP全称是Transmission Control Protocol(传输控制协议),它可以提供可靠的,面向连接的网络数据传输服务。传输控制协议主要包含下列任务和功能:1>确保IP数据报的成功传递2>.对程序发送的大块数据进行分段和重组。3>.确保正确排序及按顺序传递分段的数据。4>.通过计算校验,进行传输数据的完整性检查。TCP提供的是面向连接、可靠地数据流传输。而UDP提供的是非面相链接的、不可靠的数据传输。简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性一般。
89.你了解SVN,CVS等版本控制工具?
答:版本控制SVN,CVS是两种版本控制器,需要配套相关的SVN,CVS服务器。scm是xcode里面匹配版本控制的地方。版本控制的原理就是a和b同时开发一个项目,a写完当天的代码之后把代码提交给服务器,b要做的时候先从服务器得到最新的版本,就可以接着做。如果a和b都需要把代码提交给服务器,并且同时需改了同一个方法,就会产生代码冲突,如果a先提交,那么b提交时,服务器可以提示冲突的代码,b可以清晰的看到,并做出相应的修改或融合后再提交到服务器。
90.什么是push?
答:客户端程序留下后门端口,客户端总是监听针对这个后门的请求,于是服务器可以主动想这个端口推送消息。
91.静态链接
答:此为.a文件,相当于Java里面的jar包,把一些类编译到一个包中,在不同的工程中如果导入此文件就可以使用里面的类,具体使用依然是#improt"xx.h"
92.fmmpeg框架
答:音视频框架,内部使用UDP协议针对流媒体开发,内部开辟了6个端口来接受流媒体数据,完成快速接受之目的。
93.320框架
答:ui框架,导入320工程作为框架包如同添加一个普通框架一样。cover(open)?flower框架(2d仿射技术),内部核心类是CATransform3D.
94.什么是沙盒模型?哪些操作是私有的api的范畴?
答:某一个iPhone工程进行文件操作有此工程对应制定的位置,不能逾越。iPhone沙盒模型有四个文件夹documents,tmp,app,library,永久数据存储一般放在documents文件夹,得到模拟器的路径的可使用NSHomeDirectory()方法。NSUserdefault保存的文件在tmp文件夹里。
95.在一个对象的方法里面:self.name = "object";和name="object"有什么不同吗?
答:self.name = "object":会调用对象setName()方法;name =“object”:会直接把object赋值给当前对象的name属性。
96.简要说说viewDidLoad和viewDidUnload何时调用
答:viewDidLoad在view从nib文件初始化时调用,loadView在controller的view为nil时调用。此方法在编程实现view时调用,view控制器默认会注册memory warning notification,当view controller的任何view没有用的时候,viewDidUnload会被调用,在这里实现将retain的view release,如果是retain的IBOutlet view属性测不要在这里release,IBOutlet会负责release。
97.简述内存分区情况?
答:1>.代码区:存放函数二进制代码 2>.数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量 3>.堆区:通过malloc等函数或new等等造作符动态申请到,程序员手动申请和释放 4>.栈区:函数模块内申请,函数结束时系统自动释放。存放局部变量、函数参数
98.队列和栈有什么区别?
答:队列和栈是两种不同的数据容器。从”数据结构“的角度看,他们是线性结构,即数据元素之间的关系相同,队列是一种先进先出的数据结构,他在两端进行操作,一端进行出队列操作。栈是一种先进先出的数据结构,他只能在栈顶进行操作,入栈和出栈都在栈顶操作。
99.HTTP协议中,POST和GET的区别是什么?
答:GET方法 GET方法是不安全的,数据置于请求行,客户端地址行可见:提交的数据大小也有限,不可以设置书签 POST方法 相对来说数据安全,数据置于主体(body)内,客户端不可见,post方法提供的数据大小没有限制。可设置书签。平时开发的时候,传输的参数内容不较少和对数据安全度不高的情况下可以用get,比如新闻消息、查询用户须知等。其实post也可以通过以下拦截工具拦截(如青花瓷)的。只不过相对get安全一些,一情况下关系到密码都需要加密。也就是说想登陆、注册、忘记密码都必须用post(安全考虑),意见反馈也是用post,因为发送的内容一般比较长。
100.iOS的系统框架?
答:iOS的系统框架分为(核心操作系统层theCoreOSlayer)、(核心服务层theCore Servier layer)、(媒体层 theNedia layer)和(Cocoa界面服务层the Cocoa Touch layer)四个层次。
101.控制主要响应3种事件
答:1>.基于触摸的事件;2>.基于值得事件,3>.基于编程的事件。
102.xib文件的构成分成哪3个图标?都具有什么功能?
答:Filer's Owner 是所有nib文件中的每个图标,他表示从磁盘加载nib文件的对象。First Responder就是用户用户当前正在与之交互的对象。view显示用户界面;完成用户交互;是UIView类及其子类。
103.简述视图控制器的生命周期?
答:loadView尽管不直接调用该方法,如果手动创建自己的视图,那么应该覆盖这个方法并将它们赋值给视图控制器的view属性。viewDidLoad只有在视图控制器将其视图加载内存之后才调用该方法,这是执行其它初始化操作的入口。viewDidUnload当视图控制器从内存释放自己方法的时候调用。用于清除那些可能已经在视图控制器中创建的对象。viewWillAppear当试图将要添加到窗口中并且还不可见的时候或者上层视图移出图层后本视图变成顶级视图时调用该方法,用于执行诸如改变视图方向等的操作,实现该方法时确保调用[super viewWillApper ] viewDidAppear 当前视图添加到窗口中以后或者上层试图移出视图后本视图变成顶级视图时,用于放置哪些需要再视图显示后执行的代码。确保调用[super viewDidAppear]
104.动画有几种基本类型:表视图有哪几种基本样式
答:动画的基本类型:隐式动画和显式动画
105.CocoaTouch 提供了4种coreAnimation过渡类型?
分别为:交叉淡化、推挤、显示和覆盖。
106.UIView与CLayer有什么区别?
答:1>.UIView是iOS系统界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的,它真正的绘画部分,是由一个CALayer类来管理的。UIView本身更像是一个CALayer的管理,访问它的根视图和跟坐标有关的属性。2>.UIView有一个重要的属性layer,可以返回它的主CALayer实例。3>.UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上加子视图layer,来完成某些特殊表示,即CALayer层是可以嵌套的4>.UIView的layer树型在系统内部,被维护三份copy。分别是逻辑树,这里是代码可以操控的;动画树,是一个中间层,系统就在这一层上修改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上的内容。5>.动画的运作:对UIView的subLayer(非主Layer)属性进行修改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。6>.坐标系统:CALayer的坐标系比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是一个比例值。这个点各种图形变换的原坐标点,同时会更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。7>.渲染:当更新曾,改变不能立即显示在屏幕上。当所有层都准备好时,可以调用setNeedsDisplay方法来重绘显示。8>.变换:要在一个图层中添加一个3D或仿射变换,可以分别设置层的transform和affineTransform属性。9>.变形:Quartz core的渲染能力,使二维图像可以被自由操作,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转、缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。
107.Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用?
答:上下文:主要用于描述图形写入哪里;路径:用于保存配置变换的值、填充和看轮廓、alpha值等。
108.iOS主要提供了几种播放音频的方法?
答:SystemSoundServices 、 AVAudioPlayer类 、Audio Queue Sevices、OpenAL
109.使用AVAudioPlayer类调用哪个框架、使用步聚?
答:AVFoundation.framework,步聚:配置AVAdioPlayer类的委托方法:控制AVAudioPlayer类的对象,监控音量水平;放回进度和拖拽播放。
110.有哪几种手势通知方法、写清楚方法名?6种手势识别名称?
答:1>touchesBegan 2>.touchesMoved 3>.touchesEnd 4>.touchesCanceled 轻击手势(TapGestureRecognizer)、清扫手势(SwipeGestureRecognizer)、长按手势(LongPressGestureRecognizer)、拖动手势(panGestureRecognizer)、捏合手势(PinchGestureRecognizer)、旋转手势(RotationGestureRecognizer)
详情参考:http://www.open-open.com/lib/view/open1435284827732.html
111.CFSocket使用有哪些步聚
答:创建socket的上上线文;创建socket;配置要访问的服务器信息;封装服务器信息;链接服务器
112.core Foundation中提供了哪几种操作socket的方法?
答:CFNetwork、CFSocket和BSD Socket.
113.解析XML文件有哪些方式
答:以DOM方式解析XML文件;以SAX方式解析XML文件;
114.iOS平台怎么做到数据的持久化?coreData和site有必然联系?coredata是一个关系型数据库吗?
答:iOS中可以有四种数据持久化的方式:属性列表plist、对象归档、sqlite3和coreData可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取它。coredata提供了基础结构去处理常用的功能,例如保存,回复,撤销和重做,允许你的app创建新的任务。在使用coredata的时候,你不用安装额外的数据库系统,因为core Data使用内置的sqlite数据库,coredata将你的app的模型层放入到一组定义在内存中的数据对象。coredata会跟踪这些对象的改变,例如用户执行撤销命令。当core data 在对你app数据的改变进行保存的时候,coredata会把这些数据归档,并永久保存。mac sx 中sqlite库,他是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与coredata 框架不同的是,sqlite 是使用程序式的,sql的主要API来直接操作数据表。core Data 不是一个关系型的数据库,也不是关系型数据库管理系统(RDBMS).虽然coreData 支持aqlite 作为一种存储类型,但不可能使用任意的sqlite数据库。coredata 在使用的过程中自己创建这个数据库。coredata支持对一、对多的关系。
115.获取一台设备唯一标识的方法有哪些?
答:1>.UDID:40个字符和数字组成(13年5月1日禁用)3>.MAC ADDRESS(禁用);2>.UUID;4.OPEN UDID(升级后改变);5.广告标示符;6.Vindor标示符;
UIDID:
116.图片压缩的方法理解
答:1.图片压缩就是把图片压成二进制的流。NSData *data = UIImageJPEGRepresentation(subImage,1.0); 一般情况先采取的是图片重绘,绘制的尺寸是后边设置的尺寸(一般比原图片尺寸要小)。所以,当图片上传成功后从服务器请求下来的图片会变得分辨率下降。
117.友盟统计的具体操作?
118.获取设备的唯一标示?
答: 参考: http://zhidao.baidu.com/link?url=zCt04k5HvJEbDJZTHSI72KPZvjALrUkIE2xwreRa0-HPZNH_98aOiNGSLFYz4axsdRLwTWRDLNVvOAXW-o0cd56OgGPH7_ZcGQ4Okpyjcne
http://zengrong.net/post/2152.htm
http://www.cnblogs.com/max5945/archive/2013/06/24/3152292.html
119.有盟统计的崩溃日志重现?
答:友盟的崩溃收集 http://m.blog.csdn.net/article/details?id=8778198 友盟崩溃是在崩溃的时候将崩溃的日志存信息存在本地 下次启动时通过子线程偷偷的将崩溃日志发给友盟的后台。友盟记录崩溃是通过系统发送通知的获得崩溃信息。有一次自己调用了一个崩溃收集导致友盟崩溃收集记录的崩溃点明显变少。是应为自己的崩溃收集文件崩溃时,底层发送通知方法覆盖了友盟崩溃收集的发送崩溃通知方法。
1.平时遇到的崩溃问题?
答:1.nil类型 当NSDictionary,字典存储了nil的value 2.数组越界 3.赋值给给了空指针 3.应用了内存没有优化好的第三方 4.版本不适配(比如说版本只支持ios8 以上的app运行在了ios7上)5.kvo的观察着没有remove掉。6.方法错误 6.还用一些测试的几率抛出比较小的崩溃。如后台在某个字段在某种情况下传了一个nil类型的数据或者脏数据。测试时没有测出来的要靠有盟统计崩溃收集来记录。
2.mvvm的架构
答:
3.崩溃点查找?
答: 1.全局断点 2.看崩溃日志 3.一部分一部分的注释 4.查看有盟统计上的崩溃收集。查看该崩溃的崩溃日志。
4.视屏下载
答:可以自己写的 NSURLSessionTask 拥有属性countOfBytesReceived和countOfBytesSent两个属性,下载的数据可以存沙河,也可以存数据库。
5.动画总结?
答:IOS中绘图技术主要包括:UIKit,Quartz 2D、coreAnimation和OpenGL ES, UIKit是力学基本框架(可以绘制力学动画) 其中Core Animation提供动画是现实技术(可以绘制图层、显试动画、隐试动画、关键帧动画)。OpenGL ES是OpenGL的针对嵌入式简化设备的简化版本,用以绘制2D和3D的图形.
6.直播
答:一个完整的直播过程,包括采集、处理、编码、封包、推流、传输、转码、分发、拉流、解码、播放从推流到播放在经过中间转发环节、延迟越低用户体验越好。
比较好的直播框架 ijkplayer 框架,基于c语言的封装。集成ijkpalyer的流程:1.环境的搭建homebrew �2.下载ijkplayer 3.下载ffmpeg并编译 4.项目集成。常用的三方框架很多了,如:腾讯云、百度云、七牛等。
7.线程同步?
答:
8.oc和HTML5交互?
答: