iOS提升将来跳槽用iOS精品文章

iOS面试被问到的问题

2017-03-22  本文已影响2488人  ITCooler

近期面试问答汇总

@property(nonatomic,getter=isOn) BOOL on; 中的getter = isOn的含义?

答:
如果这个property是 BOOL on, 那么Objc默认创建的 setter 为: - (void)on:(BOOL)setOn { } getter 为: - (BOOL)on { return on; } 但是你可以手动更改 setter 和 getter 方法,就像上面的: getter = xxxOn 的话, getter 就变为: - (BOOL)xxxOn { return on; }
同样setter也是一样的道理

什么是内存管理机制

所谓内存管理就是所有权机制,对象被拥有的计算量不为0,才得以存在,不然被销毁。
alloc:分配内存,引用计算数为1
Copy:创造该对象复本,对该副本拥有并计数为1
Retain:对持有对象计数+1,当进行setter时会先判断该对象是否与原来一致
Release:销毁对象
autoRealease:系统自动在未来某个时段计数器-1
Strong:ARC引入属性,与retain一样,对对象持有,也就是在自身销毁同时,所持有对象也会销毁,可能会造成死锁。
Weak:ARC引入属性,只是引用对象并不将计数加1,前该对象被销毁后指针为空。

比较WebView与UKWebView之间的区别

  1. 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
  2. 允许JavaScript的Nitro库加载并使用(UIWebView中限制);
  3. 支持了更多的HTML5特性;
  4. 高达60fps的滚动刷新率以及内置手势;
  5. 将UIWebViewDelegate与UIWebView重构成了14类与3个协议(查看苹果官方文档)
    window.webkit.messageHandlers.closeMe.postMessage(null);
    //OC注册供JS调用的方法
    [[_webView configuration].userContentController addScriptMessageHandler:self name:@"closeMe"];
    //OC在JS调用方法做的处理

数据库操作知道吗,你使用了哪些第三方的,有什么优势

苹果自带有coreData:CoreData是一个模型层的技术,也是一种持久化技术(数据库),它能将模型对象的状态持久化到磁盘里,其底层也是数据库sqlite的存储。
一般用第三方FMDB来自己sqlite的操作,为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
FMDatabaseQueue的创建 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用 [queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
以队列的方法添加操作,保证对数据库的操作不会出错。

在OC中这些声明的作用,对对应的成员变量进行权限声明

@protected 该类和所有子类中的方法可以直接访问这样的变量。
@private 该类中的方法可以访问,子类不可以访问。
@public 可以被所有的类访问
@package 对framework而言内部使用,对外private,适合第三方静态库类

为什么Block 要用Copy属性

Block一开始放在栈上的,而代码块内的数据会用到本地变量,只有Copy会才能放到堆上,而且本地变量要使用弱引用,retail不加1

为什么Delegate 不能用Strong,可以用weak,assign?

如果使用Strong,当两个对像互相把对方作为代理时,项目一个释放会引起另一个的释放,造成列循环。ARC引入strong和weak两个内存管理属性(以及__strong, __weak, __unsafe_unretained, __autoreleasing四个变量生命期qualifier)之后,对象的delegate成员变量就面临着对内存管理属性的选择:weak or assign
众所周知,weak属性的变量是不为其所属对象持有的,并且在该变量被销毁之后,此weak变量的值会自动被赋值为nil。而assign属性一般是对C基本数据类型成员变量的声明,当然也可以用在对象类型成员变量上,只是其代表的意义只是单纯地拷贝所赋值变量的值。即如果对某assign成员变量B赋值某对象A的指针,则此B只是简单地保存此指针的值,且并不持有对象A,也就意味着如果A被销毁,则B就指向了一个已经被销毁的对象,如果再对其发送消息会引发崩溃。
但在delegate成员变量这个细分领域,我们即可以用weak,又可以用assign。因为在几乎所有场景下,delegate所指向的对象C的生存期都是覆盖了delegate成员变量本身所在的对象D的生存期的,所以,在D的生存期内,C所使用的D的指针都是有效的,所以这个时候使用assign是没有关系的。

什么是NSLoop?用在哪些地方

说一说你项目用到的混合加密及信息通信安全机制

每次App启动先生成一个随机的DES密钥A,然后加密要传输的字段后保存在字典中,将DES密钥用AES公钥加密B后保存在字典中。后台用私钥解密出DES密钥后再用来解密传输字段,最后得出原始数据并保存该加密B与对应的DES密钥A
后面使用HTTPS进行通信加密,使用公证的证书最为安全。

如何保证在数据传输中不被重放攻击

以时间戳作为传参,后台协商响应时间差范围,参考三次握手协议两边商量序列号,当发过来的序列号为服务器也存在的序列号则丢弃。

四种设计模式:单例模式,MVC,委托和观察者模式

单例:UIApplication,UserDefault,UIAccelerometer,NSNotification,NSFileManager,NSBundle
委托:委托对象主要对控件对象的操作和状态作出响应,数据源委托是必须实现的
观察者模式四个组成部分:
抽象主题:观察者容器,添加移除及向观察者发送通知
抽象观察者:是一个协议,可以更新对象
具体观察者:具体实现
具体主题:SubScript协议实现
具体应用:通知与KVO(对象属性发生变化时通知给观察者对象)

MVC模式:

Model:保存应用数据状态,回应视图状态查询,处理应用业务逻辑,完成应用功能,将状态变化通知视图
View:为用户展示信息提供接口,通过视图向控制器发出请求,向模型发出数据查询
Controller:接收用户请求,更新模型数据,更新所对应视图状态响应用户请求,作为视图和模型的媒介,降低耦合度,权责清晰提高开发效率

Iphone 与iPad区别控件:iPad独有UIPoperViewController UISpiltController

分层架构设计:

表示层:界面显示
业务逻辑层:处理表示层提供数据并返回结果到表示层进行显示
数据持久层:进行本地或网络访问
信息系统层,存在本地或网络的信息

Textkit为程序员提供文字排版和渲染功能,主要实现图文混排的功能

数据持久化方式

沙箱目录
属性列表
对象归档(将对象进行序列化成为文件)
sqlite
CoreData(对象关系映射技术,也是SQLite)

XML是一种自描述的数据交换格式,两种读取方式:SAX(从上到下,只读,速度快)和DOM (节点方式可更改,要先读完后才能操作)系统自带NSXMLParse,第三方GDataXML
Json:轻量级数据交换格式,自带NSJsonSerliazation,最快,处理相当麻烦,第三方JsonKit,SBJson

HTTP与HTTPS的区别

HTTP:80
HTTPS:超文本文件传输安全协议:443 SSL:40位关键字 RC4流加密算法

Git操作

Git添加到工作区:git add
Git提交到master: git commit -m “”
Git上传到目标库:git push --set-upstream iOSMVCTemple master
Git添加远程目标:git remote add name gitAddress

封装,继承,多态的意义

封装:对名隐藏细节,保证数据不被破坏,使代码模块化
继承:代码重用,方便子类扩展
多态:允许用父类指针指向子类,因为子类实现对父类方法的重写,所以对同一消息有不同响应
前两者实现对代码的重用,最后个实现对接口的重用。

浅复制和深复制的区别?

浅层复制:只复制指向对象的指针,而不复制引用对象本身。对于要进行拷贝的对象,自身要实现NSCoding协议 -initWithZone:(NSZone)Zone

类别优劣?

category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

KVO与 KVC

kvc:键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。
kvo:键值观察机制,当被观察的某一属性变化可进行响应

为什么说oc是动态运行时语言?

答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

说说推送的实现原理

当我们选择接收远程远程推送的时候,系统将应用BundleId和UUID发送到苹果自己的APNS服务器进行唯一设备和唯一App的注册,服务器进行注册后返回Tocken作为访问令牌,用户服务器通过推送证书和得到的Tocken向APNS请求发送推送消息,APNS服务器收到请求后进行列表查找然后向指定设备发送消息。

单例的核心是什么

保证实例对象只被初始化一次,并在整个程序周期中反复使用

讲讲网络接口编程是什么

好好学习后再写

什么是多线程

针对计算机多核设计的一套并发操作,多个任务同时进行,目前iOS上的多线程操作包括:NSThread,NSOperation,GCD,其中苹果推荐使用GCD

App的性能优化可以从哪方面入手

正确重用Cell,图片缓存,避免加载大的Xib文件,不要把主线程放到block里面,用好多线程,选择合理的方式进行数据的持久化,使用ARC,autoPool
View尽量使用不透明的,使用gzip获取大量数据,解压工作放在后台,尽量避免格式转换一定要用可以使用单例,重用大开销对象,,使用好Cache,重用延时加载Views,处理内存警告,避免反复使用或处理数据,使用wkWeb加载数据

SDWebImage的实现原理

主要运用来加载网络图片,根据网络请求先去内存查找对应的图片,然后去硬盘(如果设置的话),如果都没有去网络下载放到缓存,下次直接本地加载,使用NSCache作为缓存,异步操作,在回调中处理结果,使用NSOperation回调结果。

你一般用过的第三方好用的库

Jsonkit(Json格式转换器)
MJRefresh:刷新工具
MJExtention:数模转换
Masonry:约束布局
FMDB:sqlite数据器操作封闭
UShare:友盟第三方分享工具
ShareSDK:Mob第三方分享
JPush:极光推送
Open SSl:加密库
微信支付SDK
支付宝SDK
SVProgressAssistant:加载框
MBProgressAssistant:加载框
ImageBrowerVC:图片展示器
IQKeyboardManager:文本输入自己调整屏幕
DQAlertView:应用Model弹框
BlocksKit:代码块方式实现控件消息响应
KYVedioPlayer:第三方播放器
UIView+RSAdditions:视图定位器
UITableView+FDTemplateLayoutCell:TableViewCell高度自动计算器
KAlertView:弹框
AFNetworking:第三方网络库
BaiduMap:百度地图库
SDScrollView:图片轮播
LBXScanView:二维码扫描
RongIMKit:融云通信
AliyunOSSiOS:阿里云数据上传库

上一篇 下一篇

猜你喜欢

热点阅读