面试题总结

作者: 心情的蛊惑 | 来源:发表于2017-04-07 21:09 被阅读167次

    首先申明:以下题目答案,仅是自己的总结,如有错误,还请多多指正。

    一,谈一下对远程推送(苹果推送机制)的理解
    对于苹果推送机制,可分为大致5步:
    1,手机应用程序向苹果服务器(APNs)发送ssl请求,请求注册推送通知的服务(即获取推送证书)
    2,苹果服务器(APNs)分配给应用程序一个token值,生成了推送证书
    3,应用程序把APNs分配的token值,发给自己的后台
    4,后台把要推送的消息和token值发送给APNs
    5,APNs根据这个token值和BuddleId查找应用程序,把消息推送出去
    以下是我做的一个图,帮助大家理解

    捕获.PNG

    二,类别和类扩展的区别
    类别和类扩展都可以用来为类扩充的功能。
    类别:可以为有源代码的类和无源代码的类扩充功能,而且只能添加方法(方法必须实现),子类可以继承,可直接访问。
    类扩展:只能为有源代码的类扩充功能,不仅可以扩充实例变量,也可以扩充方法。但是方法和实例变量都是私有的,子类可继承,但不可直接访问。

    三,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。类中通过<protocol1,protocol2,...>来表示支持某个协议。如@interface A : Object < NSCopying, NSTransform >-@end表明类A继承与Object类,并支持两个协议(NSCopying, NSTransform )。
    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就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

    1. ojc-c是通过一种"referring counting"(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.

    2. NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.

    3. 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];
    }

    相关文章

      网友评论

        本文标题:面试题总结

        本文链接:https://www.haomeiwen.com/subject/nylcattx.html