首先申明:以下题目答案,仅是自己的总结,如有错误,还请多多指正。
一,谈一下对远程推送(苹果推送机制)的理解
对于苹果推送机制,可分为大致5步:
1,手机应用程序向苹果服务器(APNs)发送ssl请求,请求注册推送通知的服务(即获取推送证书)
2,苹果服务器(APNs)分配给应用程序一个token值,生成了推送证书
3,应用程序把APNs分配的token值,发给自己的后台
4,后台把要推送的消息和token值发送给APNs
5,APNs根据这个token值和BuddleId查找应用程序,把消息推送出去
以下是我做的一个图,帮助大家理解
二,类别和类扩展的区别
类别和类扩展都可以用来为类扩充的功能。
类别:可以为有源代码的类和无源代码的类扩充功能,而且只能添加方法(方法必须实现),子类可以继承,可直接访问。
类扩展:只能为有源代码的类扩充功能,不仅可以扩充实例变量,也可以扩充方法。但是方法和实例变量都是私有的,子类可继承,但不可直接访问。
三,self.name = nil 的机制,以及 [ _name release] 的区别
self.name = nil 是调用属性生成的setter方法,会将原有的对象释放release,然后将实例变量的值置为空,以后在访问该实例变量不会出现任何内存问题。
[ _name release] 只是简单的将对象的引用计数减1,而指针变量中依然存储该对象的地址,如果此时该对象空间被系统回收了,再访问实例变量,就会产生野指针异常。
四,数据持久化有哪几种
1,plist文件,通常用于储存用户设置,也可用于储存捆绑的信息
2,preference,偏好设置,常用于保存少量数据
3,NSKeyedArchiver,归档,将内存中的对象实例保存成binary到磁盘并且可以逆向这个过程用来保存用户操作状态等
4,sqlite3,使用数据库进行储存
5,CoreData,它提供了对象----关系映射(ORM)的功能,既能将OC对象转化成数据保存在sqlite数据库文件中,也能将保存在数据库中的数据还原成OC对象。
五,:比较GCD和NSOperation异同
GCD和NSOperation都是苹果提供的多线程实现方案。GCD是基于C语言的API,使用起来方便在开发中大量使用,但是取消和暂停线程比较麻烦,另外苹果专门对GCD做了性能上的优化;而NSOperation是基于OC的,面向对象,又兼容KVO,取消和暂停线程容易。
iOS首先引入的是NSOperation,在iOS4.0之后又引入的GCD和NSOperationQueue。
NSOperation:
1,NSOperation拥有很多函数。
2,在NSOperationQueue中可以建立各个NSOperation之间的依赖关系。
3,兼容KVO,可以监测NSOperation是否正在执行isExecuted,是否结束isFinished,是否取消isCanceled
4,NSOperationQueue可以方便的管理并发,NSOperation之间的优先级
GCD:
一般结合block使用。
六:UIViewController的生命周期方法有哪些
视图创建:
alloc-------创建对象,分配内存空间
init----------初始化对象
loadView---------从nib载入视图,(这一步不需要去干涉,除非没有使用xib创建)
ViewDidLoad-------载入完成,可以进行自定义数据以及动态创建其他控件
ViewWillAppear-------视图将要出现在屏幕上
ViewDidAppear-------视图已经在屏幕上
视图销毁:
viewWillDisappear----------视图将要从屏幕上移除
viewDidDisappear----------视图已经从屏幕上移除
dealloc----------视图被销毁
七,代理为什么使用weak
属性关系:
ARC MRC
strong-------retain 强引用 引用计数+1
weak--------assign 弱引用 直接赋值
只要存在一个强引用,对象就会一直存在,不会被销毁。在ARC下代理用weak要比用assign好,因为用weak,最后会走self.delegate = nil,而assign还可以指向被释放掉的内存,导致程序崩溃;retain引用计数+1,容易出现内存错误。
八,CALayer和UIView关系是怎样的
1,UIView可以相应事件,Layer不可以
UIView继承于UIReponder,在UIResponder中系统定义处理各种事件和事件传递的接口,CALayer直接继承于NSObject,没有相应的处理事件接口。
2,View中的frame,bounds,center方法,UIView并没有做什么,只是调用了底层的CALayer的方法。
3,UIView主要是对内容的显示管理,CALayer是内容的绘制。
每个UIView内部都有一个CALayer对内容进行绘制显示。
九,imageNamed:和 imageWithContentOfFile:区别
imageNamed采用缓存机制,会把读到的图片缓存起来,第二次读到的时候直接加载,但是对象销毁的时候,内存不能释放。
imageWithContentOfFile:会把图片加载到内存中,占用的内存比较小,对象销毁的时候,内存可以释放,但是会重复加载。
十,常见的OC数据类型有哪些,和C语言的有啥区别
OC:NSString,NSNumber,NSArray,NSMutableArray,NSData等都是class,创建之后便是对象。
C:int,一定字节的内存空间,用来存放数值
十一,什么时候用delegate,什么时候用Notifaction
delegate针对一对一关系,并且reciever可以返回值给sender,所以delegate用于sender想要返回值的时候。
notifaction针对一对一或一对多,reciever无法返回值给sender,notifaction用于通知多个对象的时候。
十二,属性意义
readwrite:读写,编译器会自动合成getter,setter方法
readonly:只读,编译器会自动合成getter方法
assign(weak):弱引用,setter方法直接赋值,一般用于基本数据类型和结构体类型
retain(strong):强引用,引用计数加1,一般用于对象类型
copy:与retain一样,会将对象复制一份,引用计数会加1
atomic:原子属性,保证同一时刻只有一条线程修改,访问对应的实例变量
noatomic:非原子属性,多线程并发访问提高性能
十三,什么时候用NSMutableArray,什么时候用NSArray
NSArray:静态的,不可变,一旦初始化,不能修改,可以读取
NSMutableArray:动态的,可变,可以修改,可增加内容
十四,KVO,NSNotification和代理,KVC的区别
KVO:观察者模式,被观察者直接把消息发给观察者,是对象之间的交互。
NSNotification:观察者模式,被观察者把消息发给通知中心,通知中心再把消息发给观察者,并不直接交互。
代理:代理只能一对一,一个对象只有一个代理
KVO和通知:可以一对多,一个通知可以发给多个观察者
KVC:键值编码,一种间接访问对象的属性使用字符串来标识属性
十五,写出NSTimer使用时注意事项
1,timer在不需要时,一定要调用invalidate方法使他失效,否则不能释放
timer要想销毁,必须先将他置为失效,否则timer会一直占用内存不能释放,造成内存泄漏,且该内存泄漏不能用xcode,instruments检测出来。
2,timer使用的时候需要加到runloop中
十六,列举熟悉的cocoa touch框架
Core Audio :强大的音频功能
CoreData :数据库管理
cocoa touch一小部分框架:
音视频:core Audio ,Media library ,AV Foundation
数据管理:coreData, sqlite
图形动画:core Animation,OpenGl,Quartz 2D
网络应用:webKit,BSD, sockets
用户应用:Address Book ,core Location ,Mapkit ,storeKit
十七,iOS内存管理
谁申请,谁释放
内存管理主要要避免“过早释放”和“内存泄漏”。对于“过早释放”,要注意使用@property设置特性时,一定要用对特性关键字;对于“内存泄漏”,申请了记得释放。
alloc和new生成的对象需要手动释放。
设置@property正确的属性,retain在合适的地方释放。
十八,项目目录结构
一个合理的目录结构首先应该是清晰的,让人一眼看上去就能大概了解目录的职责,且容易应对新的变化。
目录结构
AppDelegate 这个目录下放的是AppDelegate.h(.m)文件,是整个应用的入口文件,单独拿出来。
Models 这个目录下放一些与数据相关的Model文件BaseModel.h BaseModel.m…….
View(视图):
Controller(控制器):
Expand(拓展):
放一些工具类(Tool),宏
网络(Network),
分类(Category),
数据库(DataBase)等
Resource(资源):plist文件或者图片之类
.pch:文件放的是一些宏定义一些接口之类
十九,常用的第三方框架
MBProgressHUD提示效果 支持各种状态加载的提示效果,以及带进度的提示效果。
SDWebImage图片异步加载及缓存SDWebImage用于异步下载网络上的图片,并支持对图片的缓存等。
XMPP 实时聊天,XMPP协议算是很成熟的方案了。使用XMPPFramework可以直接和OpenFire服务器打交道。
AFNetworking 网络请求
FMDB 数据库
Masonry 纯代码添加约束
二十,CoreData:
Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,
1.Core Data 是数据持久化存储的最佳方式
2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型
在Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式
3.好处:能够合理管理内存,避免使用sql的麻烦,高效
4.构成:
(1)NSManagedObjectContext(被管理的数据上下文)操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSManagedObjectModel(被管理的数据模型)数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(3)NSPersistentStoreCoordinator(持久化存储助理)相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
(4)NSManagedObject(被管理的数据记录) 相当于数据库中的表格记录
(5)NSFetchRequest(获取数据的请求)相当于查询语句
(6)NSEntityDescription(实体结构)相当于表格结构
二十一,OC优缺点
优点:
1.Category是非常实用的扩展机制,可以很方便的为一个已有的类添加属性或者方法,而不需要笨拙的去继承。
2.运行时多态的概念,可以让一个类的对象动态的以其他类行为去执行(OC中多了很多运行时态的机制,其中id的特殊用途,可以通过id类型的变量,调用不同类的同名函数,即使这些类没有任何关系)。
3.ARC不用多讲了吧
4.OC中成员变量也有三种访问权限,@public,@protected,@private。但默认的是@protected,而C++中默认是private
5.OC中成员函数只有两种,一种是实例函数,一种是类函数。实例函数就是
C++中的Public函数,类函数就是public中的static函数。
6.OC中成员函数如果要接受多个参数,则需要每个参数前加冒号
7,OC还有protocol概念, 通过@protocol-@end来声明protocol。类中通过
8.由于都是C衍生出的面向对象的语言所以可以和C++混合编码。(百度地图API
就用到了)
缺点:
1.不支持多重继承
二十二,MVC设计模式是什么?你还熟悉什么模式?
M:model,负责储存,定义,操作数据
V:view,展示数据给用户,和用户交互
C:controller,Model和View之间的协调者,把model中的数据拿过来给View用。
代理模式:工厂生产了产品不直接卖,而是找代理商卖产品
单例模式:不通过alloc创建对象,通过静态方法返回这个类的对象,全局唯一。
观察者模式:一个对象改变,所有的观察者都会做出反应。
工厂模式:工厂加工产品
二十三,深拷贝,浅拷贝
浅拷贝:只复制对象的指针,(如人的影子)
深拷贝:复制对象(如人的克隆体)
以对象A为例:
浅拷贝后,只是复制了A的指针,出现一个A_浅 ,指向同一块内存资源,修改A_浅,A也会改变。
深拷贝后,复制了对象,出现一个A_深,内存中就有了2个独立的对象,一个A,一个A_深,A_深改变,A不会改变。
二十四,#import,#include,@class,#import<> ,#import""
import:OC中导入头文件的关键字,只会导入一次,不会重复导入
#import<>导入系统的,#import“”导入非系统的
include:C语言导入头文件的关键词,会重复导入
@class:声明某个类,执行时才去查看类的实现文件,解决头文件的相互包含
二十五,NSString *obj = [[NSData alloc] init];编译,运行时分别是什么样的类型。
编译是NSString,运行是NSData
二十六,OC是动态运行时语言是什么意思
多态,主要将数据类型的确定由编译时推迟到运行时。
运行时机制使我们在运行时才去决定一个对象的类别,以及调用该类别对象的指定方法。
多态:不同对象以自己的方式响应同一个消息。因此,可以说运行时机制是多态的基础。
二十七,frame和bounds有啥不同
frame,参照的是父视图,bounds,参照的是自身
二十八,线程和进程区别和联系
1,线程和进程都是操作系统运行的基本单元,系统利用该基本单元实现并发性。
2,线程和进程的主要差别在于他们不同的操作系统资源管理方式。
进程:有独立的地址空间,一个进程崩溃,不会对其他进程产生影响。
线程:是进程中不同的执行路径,有自己的堆栈和局部变量,但线程之间没有单独的地址空间。一个线程死掉等于整个进程死掉。
3,每个进程之间是相互独立的,1个进程要想执行任务,必须得有线程(每个进程至少有一个线程)
线程-------》工人 进程-------》车间
二十九,socket与http的区别
http:客户端主动向服务器发起http请求,一次连接之后立马断开
socket:客户端和服务器使用“套接字”进行连接,双方都可以主动发送数据,一次连接之后可以保持联通。
三十,block
1,block是对象,他封装了一段代码,这段代码可以在任何时候执行,
2,block可以作为函数或者函数的返回值经常用于回调及传值,而其本身又可以带输入参数或者返回值,他和传统的函数指针类似,但有区别:block是inline的,并且他对局部变量是只读的。
3,block是存在于栈中的,定义block是用copy,从栈中copy到堆中。MRC下,用_ block,ARC下,用 _weak .
三十一,堆和栈
1)管理方式
栈:编译器自动管理
堆:由程序员释放
2)申请大小:
栈:向低地址扩展的数据结构,一块连续的内存区域。
堆:向高地址扩展的数据结构,不连续的内存区域。
3)碎片:
栈:没有
堆:不连续,有大量的碎片
4)分配方式:
栈:静态,动态两种分配方式
堆:只有动态分配
5)分配效率:
栈:栈是系统提供的,效率高
堆:C++函数库提供的,效率低
三十二,一个tableView是否可以关联两个不同的数据源?你会怎么处理?
答:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。
因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。
因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?
三十三,xib和stroyboard的区别:
一个工程中可以有多个xib文件,一个xib文件对应着一个视图控制器和多个视图。而使用storyboard时,一个工程只需要一个主storyboard文件就可以了。因此,在包含多个视图控制器的情况下,采用storyboard管理比较方便,而且storyboard还可以描述界面之间的导航关系。
三十四,关于自动释放池是什么?怎么工作?
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
ojc-c是通过一种"referring counting"(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.
NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.
autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
三十五,app升级要改变数据库结构怎么办?
数据库升级流程
1.每一次运行程序,判断数据库是否存在。如果不存在,创建数据库。如果存在,进行其他后续处理。
2.第一次安装app,创建数据库,并将版本号存入数据库中。同时保存一个当前版本号加1的字段到数据库中。
3.更新app,从数据库中读取到上一次保存的版本号字段。比如要升级为2,会直接从case2开始执行。修改完数据结构后,再一次将版本号字段存入数据库。
4.每一次数据库结构有更新,直接在后面加case语句即可。
三十六,沙盒目录结构
/Documents/ 保存应用程序的重要数据文件和用户数据文件等。iTunes 同步时会备份该目录。
/Library/Caches 保存应用程序使用时产生的支持文件和缓存文件,还有日志文件最好也放在这个目录。iTunes 同步时不会备份该目录。
/Library/Preferences 保存应用程序的偏好设置文件(使用 NSUserDefaults 类设置时创建,不应该手动创建)。
/tmp/ 保存应用运行时所需要的临时数据,iphone 重启时,会清除该目录下所有文件。
三十七,单例模式
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
});
return _instance;
}
//全局变量
static id _instance = nil;
//单例方法
+(instancetype)sharedSingleton{
return [[self alloc] init];
}