iOS 面试题杂记

问答题

  • iOS的开发和发布签名证书有何异同?
    开发签名证书绑定App ID、开发者证书、以及测试设备,用于真机测试。
    发布签名证书绑定App ID和发布证书,用于上传应用到App Store。
    发布签名证书绑定App ID、开发者证书、以及测试设备。用于生成ipa文件并deploy到对应的测试设备上进行测试。
  • iOS的消息推送机制又叫通知机制,其包括两类:本地通知远程通知
    具体可浏览:玩转消息推送后台之小白必读(iOS篇)
  • 属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在那种情况下使用?
    readwrite 是可读可写特性。需要生成getter方法和setter方法时使用。
    readonly 是只读特性。 只会生成getter方法,不会生成setter方法,不希望属性在类外改变时使用。
    assign 是赋值特性。setter方法将传入参数赋值给实例变量。声明基本数据类型时使用。
    retain 表示持有特性。setter方法的实现是release旧值,retain新值,传入参数的retaincount会+1,用于OC对象类型。
    copy 表示赋值特性。setter方法的实现是release旧值,copy新值。需要一份新的变量时使用,用于NSString、Block等类型。
    nonatomic 非原子操作。决定编译器生成的setter getter是非原子操作即setter getter方法的实现不加锁,而atomic原子操作表示多线程安全,一般使用nonatomic。

注:
非原子性(nonatomic)访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法(setter getter)都为原子型事务访问。atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

  • #import和#include有什么区别?@class呢?#import<>和#inport""有什么区别?
    一般来说导入OC文件使用#import,导入C/C++文件使用#include。
    #import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。所以,#import比起#include的好处就是不会引起交叉编译。
    @class仅仅是声明一个类名,并不会包含类的完整声明。能解决循环包含的问题:当两个类文件有循环依赖关系 ( A 引用 B , B 引用 A ) 时,需要用 @class。
    #import<>用于对系统头文件的引用,编译器会在系统文件目录下去查找该文件。
    #import""是对用户自定义的文件的引用,编译器首先会在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。

  • 类别(category)的作用?继承和类别在实现中有何不同?
    类别是OC语言的一个特性。可以在不获取不改变原代码的情况下往里面加入新的方法。只能添加,不能进行修改和删除。如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
    继承是面向对象的语言特性之一。子类会继承父类的属性和方法。继承可以增加、修改、或者删除方法,也可以增加属性。

  • Object-C的类可以多重继承吗?可以实现多个接口吗?
    Objective C不能直接使用多重继承。NSObject类型的对象在实现多重继承时用protocol委托代理来实现的。一个类可以实现多个接口。

  • id,nil代表什么?
    id:在代码中,id是指向structobjc_object的一个指针,这个意思是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。你在使用id的时候不需要加星号。比如id foo = nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id* foo = nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。
    nil:nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,表示空。

  • 类变量的@protected,@private,@public声明各有什么含义?
    @private:私有的,作用范围只能在自身类(外界既不可访问,又不能继承);
    @protected:受保护的,作用范围在自身类和子类,如果什么都不加修饰,默认是@protected(外界不可访问,但是可以继承);
    @public:共有的,作用范围最大,可以在任何地方被访问(外界即可访问,又可以继承);

  • 试列举UIKit 中常用的控件。

UILabel 文本标签
UIButtton 按钮
UITextField 文本输入框
UIImageView 图片显示
UIAlertController 弹框视图(UIAlertView 对话框,UIActionSheet 底部弹框)
UIScrollView 滚动视图
UITableView 列表
UICollectionView 
UINavigationBar 导航条
UISwitch 开关
UIPageControl 分页控件
UITextView 文字显示控件
UIPickerView 选择器
UIDatePicker 日期选择器
UIWebView 网页显示控件
UISlider 滑块
UISegmentedControl 选项卡
UIActivityIndicatorView 活动指示器
UIProgressView 进度条
  • 在开发过程中使用的HTTP网络请求框架是什么?
    AFNetworking(OC):
    新版的AFNetworking弃用NSURLConnection,改用NSURLSession。同时基于NSURLConnection的AFHTTPRequestOperationManager也被弃用,改用AFHTTPSessionManager。
    Alamofire(Swift):
    其前身是AFNetworking,Swift发布后,AFNetworking的作者使用Swift写了Alamofire。其本质是基于NSURLSession的。
  • 数据持久化存储主要有以下方式:
    1)属性列表(plist文件/Write写入):永久保存在磁盘中。它是将某些特定的类,通过XML文件的方式保存在目录中。存储时使用writeToFile: atomically:方法。读取时使用arrayWithContentsOfFile:方法。
    2)偏好设置(preference/NSUserDefaults ):用户再次打开程序或开机后数据仍然存在。获取文件并写入[[NSUserDefaults standardUserDefaults] setInteger: forKey:@“ ”]。立即同步[userDefaults synchronize]。可以存储的数据类型包括:NSData,NSString,NSDate,NSArray,NSDictionary。缺点:如果要存储其它数据类型,需要转换成前面的数据类型才可以存储。
    3)对象归档(NSKeyedArchiver):采用归档形式来保存数据,数据对象需要遵守NSCoding协议,对象对应的类须提供encodeWithCoder:和initWithCoder:方法。会进行加密处理,数据进行归档处理后会转换成二进制数据。缺点:对数据的操作比较笨拙,如果想改动数据的某一小部分,需要解压和归档整个数据,所以只能针对小量数据。
    4)SQLite3:是一个开源的嵌入式关系数据库,适合存储大量的数据。FMDB是以OC的方式封装了SQLite的C语言API。使用起来更加面向对象,省去了很多冗余的C语言代码。对比苹果自带的Core Data框架,更加轻量级、灵活。提供了多线程安全的数据库操作方法,有效的防止数据混乱。
    5)CoreData:它是苹果官方对SQLite的一个升级,是一个完全面向对象的API。需要建立模型对象,也就是建立对象之间的映射。生成模型对象实体。
  • 说说你对Runtime的理解。
    Runtime 基本上是用C和汇编写的。它是一套比较底层的C语言的API。我们写的程序在运行过程中都会被转换成runtime 的C代码执行。我们需要了解的是OC是一门动态语言,它会将一些工作放在代码运行时处理,而并非编译时。因此,我们需要一个运行时系统来处理编译后的代码。
    Objc 在三种层面上与 Runtime 系统进行交互:
    1)通过 Objective-C 源代码
    2)通过 Foundation 框架的 NSObject 类定义的方法
    3)通过对 Runtime 库函数的直接调用
  • 在做界面适配的时候有方法?
    1)人工根据frame计算
    2)Xib/Storyboard添加约束
    3)AutoLayerOut(Masonry第三方库/系统Api)
  • 实现多线程的方法有哪些?
    1)NSThread:比较早的多线程方法。需要自己管理生命周期和线程同步,不推荐使用。
    2)Grand Centeral Dispatch(GCD):简单的说GCD就是把操作放在队列中去执行。操作分为同步操作和异步操作。队列分为串行队列和并行队列。异步操作只有在并行队列中才有效。
    3)NSOperation:对GCD操作的抽象。分为NSInvocationOperation和NSBlockOperation
    4)NSOperationQueue:对队列的抽象
  • 说说瀑布流如何实现的。
    瀑布流是使用UICollectionView来实现的。主要是运用UIColectionViewLayOut,因此我们需要自定义一个layout来继承系统的UICollectionViewLayOut 。瀑布流的思路是,从上往下哪一列最短,就把item放在哪一列的下面。因此,需要一个字典来记录每一列的Y值。
  • 数据加密------MD5(不可逆)
    直接使用MD5进行加密,去MD5解密网站可暴力破解。数据只有在初次出现时是明文,其它情况均是密文处理。
    MD5的改进:
    1)加盐:在明文的固定位置加入随机串,然后再进行MD5。使用MD5解密后很容易发现规律。
    2)多次MD5加密。通过MD5解密后发现还是密文,继续进行MD5解密。
    3)先加密后乱序:先对明文进行MD5,然后对加密得到的MD5字符串进行乱序。破解难度增加。
  • 数据解析
    Json格式:
    1)NSJSONSerialization,官方提供的Json数据格式解析类,iOS5以后支持
    2)JSONKit,SBJson,TouchJson(第三方库)
    XML格式:
    1)NSXMLParse官方自带
    2)GDataXML,Google提供的开源XML解析库
  • 说说OC与Swift 混编的实现
    在OC项目中首次添加Swift文件时,Xcode会提示是否配置OC桥接文件。点击确认后,系统会自动生成一个项目名-Bridging-Header.h文件。将需要进行桥接的OC头文件添加进去即可。
  • 微信支付和支付宝支付的实现
    两者大同小异。均按照开发文档进行操作即可。
    1)首先,需要有微信开放平台的开发者账号,将应用进行注册,通过审核后,将获得AppID和AppSecret(商户密钥)。
    2)然后,在开放平台的文档中心下载iOS的SDK。将SDK 添加到工程中,并进行一系列的配置(在AppDelegate中设置相应的函数)。
    3)最后,根据Demo进行开发实现即可。
    如果在微信支付的时候,跳转到微信支付界面弹出了一个确定按钮,页面空白,这个很有可能是你的APP_SECRET没有设置对,这东西的作用是在对支付参数进行md5加密时所用到的key。
  • iOS设备提供哪三种不同定位途径
    1)蜂窝式移动电话基站定位;
    2)WiFi定位,通过查询一个WiFi路由器的地理位置信息,比较省电;
    3)GPS卫星定位,通过3~4颗卫星定位,最为准确,但是耗电量大。
    iOS系统如果能够接收GPS信息,那么设备优先采用GPS,其次是WiFi,最后是基站,开发人员不能选择哪种定位方式。
    系统定位服务直接使用CoreLocation框架。系统地图直接使用地图框架MapKit。注意iOS8之后的定位,需要在info.plist中添加 Location Usage Description,NSLocationAlwaysUsageDescription
  • 为什么iOS开发较多的使用高德地图,而较少的使用百度地图?
    1)iOS在国内默认使用高德地图
    2)高德地图是火星坐标系,mapView获取经纬度不需要转
    3)百度地图使用的是自己的坐标系,获取到的点要转成火星
  • 高德地图开发的实现
    1)首先,注册高德地图开发者账号,获取高德地图AppKey(需要输入应用名和Bundle Identifie)
    2)其次,下载并导入高德地图SDK,并参照开发文档进行简单的配置
    3)最后就可以参照Demo进行开发了。
  • SVN和Git
    CornerStone是Mac上最佳的SVN管理工具。
    对于git,可以使用终端管理,也可以借助GitHubDeskTop 管理。
  • Cocoa和Cocoa Touch的区别:
    它们都包含Objective-C运行时和两个核心框架:
    Cocoa包含Foundation和AppKit框架,用于开发Mac OS X系统的应用。Cocoa Touch是Cocoa的子类,包含Foundation和UIKit框架,用于开发iPhone OS系统的应用程序。Cocoa是 Mac OS X 的开发环境,Cocoa Touch是 iPhone OS的开发环境。Cocoa Touch与Cocoa一个比较鲜明的区别就是Cocoa Touch并不支持垃圾回收机制。
    Foundation提供了一系列基础数据类型、以及枚举、容器的支持。来自于这个框架的类名以NS开头。UIKit:iOS上的用户图形包。UI开头的类都来自于这个框架。
  • IB中的User Defined Runtime Attributes如何使用?
    Xib或Storyboard中,使用User Defined Runtime Attributes可以对控件的属性进行动态的设置。点击“+”,“-”可以添加,删除属性。常设置的属性有layer.cornerRadius,layer.borderWidth,layer.borderColorFromUIColor等。需要注意的是它是没有报错机制的,我们必须保证每一个属性都要写正确,每个Type的数据类型选择正确。下面是一些可用的Attribute Types与其相对应的数据类型:
Boolean – BOOL
Number –  NSNumber * or any numeric scalar, e.g. NSInteger
String – NSString *
Point  – CGPoint
Size  – CGSize
Rect – CGRect
Range – NSRange
Color – UIColor *

编程题

  • In stream of integers from 1 to n, only one number will be repeated. How can you tell what that number is?
    思路:先把数组排序,一次循环比较第i个元素和第i+1个元素是否相等。若想等,终止循环并输出重复的数字。
    代码:swift版
let array:[Int] = [1,12,9,8,10,7,4,10,2,6]
var resultArr:[Int] = []
resultArr = array.sorted()  //从小到大排序
for i in 0..<(resultArr.count-1) {
    if resultArr[i] == resultArr[i+1] {
        print("重复的数字是\(resultArr[i])")
        break
    }
}
  • 用1,2,3,4,5,6,7,8,9组成三个三位数abc,def,ghi,每个数恰好使用一次,要求abc:def:ghi=1:2:3,输出所有解。
    iOS 面试题杂记_第1张图片
    具体代码.jpg

期待你的评论建议O(∩_∩)O~

你可能感兴趣的:(iOS 面试题杂记)