iOS面试题 一共分为
笔试题
和面试题
两部分
笔试题
一共分为10个 总共613题
面试题
一共400题
笔试题 一个10个系列 分别为
①(语法篇) 共147题 已更新
②(常识篇) 共72题 已更新
③(界面篇) 共83题 已更新
④(iOS篇) 共52题 已更新
⑤(操作篇) 共68题 已更新
⑥(数据结构篇) 共23题 已更新
⑦(多线程篇) 共60题 已更新
⑧(网络篇) 共22题 已更新
⑨(多媒体篇) 共59题 已更新
⑩(安全篇) 共27题 已更新
面试题
一共分为3个 总共400题
⑪(面试篇 1/3) 共127题 已更新
⑪(面试篇 2/3) 共137题 已更新
⑪(面试篇 3/3) 共136题 已更新
@protocol
和Category
中如何使用@property
?参考答案:
在 protocol 中使用 property 只会生成setter和 getter方法声明,
我们使用属性的目的,是希望遵守我协议的对象能实现该属性。
category使用 @property也是只会生成 setter 和 getter 方法的声明,
如果需要给 category增加属性的实现,需要借助运行时的两个函数:
objc_setAssociateObject
objc_getAssociateObject
weak
属性需要在dealloc
中置nil
么?参考答案:
不需要
在ARC 环境无论是强指针还是弱指针都无需在dealloc 设置为 nil 。
ARC 会自动帮我们处理。即便是编译器不帮我们做这些,weak 也不需要在dealloc 中置nil 。
ARC
下,不显式指定任何属性
关键字
时,默认的关键字
都有哪些?参考答案:
对应基本数据类型默认关键字时:
atomic,readwrite,assign
对于普通的Objective-C对象:
atomic,readwrite,strong
@property
声明的NSString
(或NSArray
,NSDictionary
)经常使用关键字
copy
,为什么?如果改用strong
关键字,可能造成什么问题
?参考答案:
因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响 ,
使用 copy 无论给我传入是一个可变对象还是一个不可变对象,我本身持有的就是一个不可变的副本。
如果我们使用strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
copy 此特质所表达的所属关系与strong类似。
然而设置方法并不保留新值,而是将其”拷贝“(copy)。当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。
这个类是NSString的子类,表示一种可修改其值得字符串,此时若不拷贝字符串,
那么设置完属性之后,字符串的值就可能在对象不知情的情况下遭人更改。
所以,这时就要拷贝一份”不可变“(immutable)的字符串,确保对象中的字符串值不会无意间变动。
只要实现属性所用的对象是"可变的"(mutable)。就应该在设置新属性时拷贝一份。
objc
中向一个nil
对象发送消息
将会发生什么
?参考答案:
在Objective-C中向nil发送消息是完全有效的,只是在运行时不会有任何作用:
如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil);
objc是动态语言,每个方法在运行时会被动态转换为消息发送,即:objc_msgSend(receiver,selector)。
objc
中向一个对象发送消息[obj foo]
和objc_msgSend()函数
之间有什么关系
?参考答案:
该方法编译之后就是objc_msgSend()函数调用
unrecognized selector
的异常
?参考答案:
当调用该对象上某个方法,而该对象上没有实现这个方法的时候,可以通过”消息转发“进行解决。
简单的流程如下:
objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver,selector)。
objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,
如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常 unrecognized selector send to XXX。
objc
对象如何进行内存布局
?(考虑有父类的情况)参考答案:
所有父类的成员变量和自己的成员变量都会存放在该对象所对应的存储空间中。
每个对象内部都有一个isa指针,指向它的类对象,
类对象中存放着本对象的对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中),
成员变量的列表和属性列表,它内部也有一个isa指针指向元对象(meta Class),
元对象内部存放的是类方法列表,类对象内部还有一个superclass的指针,指向它的父类对象
runtime
Associate
方法关联的对象,需要在主对象dealloc
的时候释放么?参考答案:
无论在MRC还是ARC下均不需要。
objc
中的类方法
和实例方法
有什么本质
区别
和联系
?参考答案:
类方法:
类方法是属于类对象的
类方法只能通过类对象调用
类方法中的self是类对象
类方法可以调用其他的类方法
类方法中不能访问成员变量
类方法不能直接调用对象方法
实例方法:
实例方法是属于实例对象的
实例方法只能通过实例对象调用
实例方法中的self是实例对象
实例方法中可以访问成员变量
实例方法中直接调用实例方法
实例方法中也可以调用类方法(通过类名)
_objc_msgForward
函数是做什么的,直接调用它将会发生什么?参考答案:
_objc_msgForward是IMP,用于消息转发的:
当向一个对象发送一条消息,但是它并没有实现的时候。
_objc_msgForward会尝试做消息转发。
runtime
如何实现wea
k变量的自动置nil
?参考答案:
runtime对注册的类,会进行布局,对于weak对象会放入一个hash表中。
用weak指向的对象内存地址作为key,当此对象的引用计数为0的时候会dealloc,
假如 weak指向对象内存地址是a,那么就会以a为键,在这个weak表中搜索,找到所有以a为键的weak对象,从而设置为nil
编译后
得到的类
找那个增加
实例变量
?能否向运行时
创建的类
中添加实例变量
?为什么?参考答案:
1.不能向编译后得到的类中增加实例变量;
2.能向运行时创建的类中添加实例变量;
分析如下:
因为编译后的类已经注册在runtime中,
类结构体中的objc_ivar_list实例变量的链表和instance实例变量的内存大小已经确定,
同时runtime会调用class_setIvarLayout或class_setWeakIvarLayout来处理strong weak引用,
所以不能向存在的类添加实例变量
运行时创建的类是可以添加实例变量,
调用class_addIvar函数,
但是得在调用objc_allocateClassPair之后,
objc_registerClassPair之前,原因同上,
能向运行时创建的类中添加实例变量。
RunLoop
和线程
有什么关系
?参考答案:
总的来说,RunLoop,正如其名
loop表现某种循环,和run放在一起表示一直在运行着的循环。
实际上,RunLoop和线程是紧密相连的,可以这样说 RunLoop是为了线程而生,没有线程,它就没有存在的必要。
RunLoops是线程的基础架构部分,Cocoa和CoreFoundation都提供了RunLoop对象方便配置和管理线程的RunLoop
(以下都以Cocoa为例)。
每个线程,包括程序的主线程(main thread)都有与之相应的RunLoops对象
RunLoop和线程的关系:
主线程的RunLoop是默认启动的。
对其它线程来说,RunLoop默认是没有启动的。
如果你需要多的线程交互则可以手动配置和启动,如果线程只是执行一个长时间的已确定的任务则不需要。
在任何一个Cocoa程序的线程中,都可以通过以下代码来获取到当前线程的runLoop :
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
runloop的mode
作用
是什么?参考答案:
mode主要是用来指定事件在运行循环中的优先级的,分为:
NSDefaultRunLoopMode(KCFRunLoopDefaultMode):默认,空闲状态
UITrackingRunLoopMode:ScrollView滑动时
UIInitializationRUnLoopMode:启动时
NSRunLoopCommonModes(KCFRunLoopCommonModes):Mode集合
苹果公开提供的 有两个:
NSDefaultRunLoopMode
(KCFRunLoopDefaultMode)
NSRunLoopCommonModes
(KCFRunLoopCommonModes)
objc
使用什么机制
管理对象内存
?参考答案:
通过retainCount的机制来决定对象是否需要释放。
每次runloop的时候,都会检查对象retainCount,如果retainCount为0,说明该对象没有地方需要继续使用了,可以释放掉了
ARC
通过什么方式
帮助开发者管理内存
?参考答案:
ARC相对于MRC,不是在编译时添加retain/release/autorelease这么简单。
应该是编译期和运行期两部分共同帮助开发者管理内存。
在编译期,ARC用的是更底层的C接口实现的retain/release/autorelease,这样做性能更好,
也是为什么不能在ARC环境手动retain/release/autorelease,
同时对同一上下文的同一对象的成对release/autorelease操作进行了优化(即忽略掉不必要的操作);
ARC也包含运行期组件,这个地方做的优化比较复杂,但是不能被忽略。
autoreleasepool
的前提下,一个autorelease
对象在什么时候释放?(比如在一个vc的viewDidload
中创建)参考答案:
分两种情况:手动干预释放时机、系统自动去释放。
手动干预释放时机:指定autoreleasepool,当前作用域大括号结束时释放。
系统自动去释放:不手动制动autoreleasepool,autorelease对象除了作用域之后,会被添加到最近一次创建的自动释放池中,并会在当前的runloop迭代结束时释放。
BAD_ACCESS
在什么情况
下出现
?参考答案:
访问了悬垂指针,比如对一个已经释放的对象执行了release、
访问已经释放对象的成员变量或发消息、死循环。
autoreleasepool
的?参考答案:
autoreleasepool 以一个队列数组的形式实现,主要通过以下三个函数完成。
objc_autoreleasepoolPush
objc_autoreleasepoolPop
objc_autorelease
看函数名就可以直到,对autorelease 分别执行了push和pop操作。销毁对象时执行了release操作。
block
时什么情况会发生
引用循环
,如何解决?参考答案:
一个对象中强引用了block,在block中又强引用了该对象,就会发生循环引用。
解决方法是将该对象,使用__weak 或者 __block修饰符修饰之后在block中使用。
id weak weakSelf = self;
或者
weak __typeof(&*self) weakSelf = self 该方法可以设置宏
id __block weakSelf = self;
或者将其中一方强制置空:
xxx = nil.
block
内部如何修改block
外部变量?参考答案:
默认情况下,在block中访问的外部变量是复制过去的,即:写操作不对原变量生效。
但是你可以加上__block来让其写操作生效,示例代码如下:
__block int a = 0;
block
api
(如UIView的block版本写动画时)们是否也考虑引用循环
问题?参考答案:
系统的某些block api中,UIView的block版本写动画时 不需要考虑。
GCD
的队列(dispatch_queue_t
)分那两种类型
?参考答案:
串行队列 Serial Dispatch Queue 和 并行队列 Concurrent Dispatch Queue。
GCD
同步若干个异步调用
(如果根据若干个url异步加载多张图片,然后在都下载完成合成一张整图)?参考答案:
使用Dispatch Group 追加block到Global Group Queue,
这些block如果完全执行完毕,
就会执行 Main Dispatch Queue 中的结束处理的block。
dispatch_barrier_async
的作用是什么?参考答案:
在并行队列中,为了保持某些任务的顺序,需要等待一些任务完成后才能继续执行,使用barrier来等待之前任务完成,避免数据竞争问题。
dispatch_barrier_async 函数会等待追加到 Concurrent DIspatch Queue 并行队列中的操作全部执行完之后,
然后再执行 dispatch_barrier_async函数追加的处理。
等dispatch_barrier_async 追加的处理执行结束之后,Concurrent DIspatch Queue 才恢复之前的动作继续执行。
NSString *_foo
调用SetValue:forKey:
时,可以以foo
还是_foo
作为key
?参考答案:
都可以
KVC
和KVO
的KeyPath
一定是属性
么?参考答案:
KVC支持 实例变量 ,
KVO只能手动支持手动设置实例变量的KVO实现监听。
IBOutlet
连出来的视图属性为什么可以被设置weak
?参考答案:
因为既然有外链那么视图在xib或者Storyboard中肯定存在,视图已经对它有一个强引用了
使用Storyboard(xib不行)创建的vc,会有一个叫_topLevelObjectsToKeepAliveFromStoryboard的私有数组强引用所有top level的对象,所以这时即便outlet声明成weak也没关系。
User Defined Runtime Attributes
是如何使用?参考答案:
它能够通过KVC的方式设置一些你interface builder中不能配置的属性。
当你希望在IB中做尽可能多的事情,这个特性能够帮助你编写更加轻量级的ViewController。
lldb(gdb)
有哪些常用的调试
命令?参考答案:
breakpoint:设置断点定位到某一个函数
n:断点指针下一步
po:打印对象
工厂模式
最主要的好处
是什么?参考答案:
工厂模式的最大好处是增加了创建对象时的封装层次。
如果你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。
UIScrollView
用到了什么设计模式
?参考答案:
组合模式composition,所有的container view都用了这个模式。
观察者模式 observer,所有的UIResponder都有了这个模式。
模板(template)模式,所有DataSource和delegate接口都是模板模式的典型应用。
Swift
中出现循环引用
的情况,并说明怎么解决。参考答案:
循环引用出现在当两个实例对象相互拥有强引用关系的时候,
这会造成内存泄露,原因是这两个对象都不会释放。
只要一个对象被另一个对象强引用,那么该对象就不能被释放。
由于强引用的存在,每个对象都会保存对方存在。
解决这个问题的方法是,用wake或者unowned引用代替其中一个的强引用,来打破循环引用。
闭包
是引用类型
吗?参考答案:
闭包是引用类型。
如果一个闭包被分配给一个变量,这个变量复制给另一个变量,
那么它们引用的是同一个闭包,它们的捕捉列表也会被复制。
泛型类
,泛型结构体
,泛型协议
的功能特性都包含在Swift中吗?参考答案:
Swift包含泛型类,泛型结构体特性。
泛型可以在类、结构体、枚举、全局函数或者方法中使用。
泛型协议是通过typealias部分实现的。
typealias不是一个泛型类型,它只是一个占位符的名字。
它通常是作为关联类型被引用,只有协议被一个类型引用的时候它才被定义。
optional
变量拆包
有多少种方法?并在安全方面进行评价。参考答案:
强制拆包!操作符 — 不安全
隐式拆包变量声明 ---- 大多数情况下不安全
可选绑定 —安全
自判断链接(optional changing) ---- 安全
nil coalescing 运算符(空值合并运算符) — 安全
Swift2.0的新特性 guard语句 — 安全
Swift2.0的新特性 optional pattern (可选模式) — 安全
不得不
使用隐式拆包
。说明原因。参考答案:
对optional变量使用隐式拆包最常见的原因如下:
对象属性在初始化的时候不能nil,否则不能被初始化。
典型的例子是 interface Builder outlet类型的属性,他总是在它的拥有者初始化之后再初始化。
在这种特定的情况下,假设它在interface Builder中被正确的配置 — outlet被使用之前,保证它不为nil
解决强引用的循环问题–当两个实例对象互相引用,并且对引用的实例对象的值要求不能为nil时候。
在这种情况下,引用的一方可以编辑为unowned,另一方使用隐式拆包。
建议:除非必要,不要对optional类型使用隐式拆包。
使用不当会增加运行时崩溃的可能性。
在某些情况下,崩溃可能是有意的行为,但有更好的方法达到相同的结果,例如,通过使用fataError()函数。
泛型
。泛型
是用来解决什么问题
的?参考答案:
泛型是用来使类型和算法安全的工作的一种类型。
在Swift中,在函数和数据结构中都可以使用泛型,例如类、结构体和枚举。
泛型一般是用来解决代码复用的问题。
常见的一种情况是,你有一个函数,它带有一个参数,参数类型是A。
然而当参数类型改成B的时候。你不得不复制这个函数。
Swift
中,什么时候用结构体
,什么时候用类
?参考答案:
一直都有这样的争论:
到底是用类的做法由于用结构体,
还是用结构体的做法优于类。
函数式编程倾向于值类型,面向对象编程更喜欢类。
在Swift,类和结构体有许多不同的特性。下面是两者不同的总结:
类支持继承,结构体不支持。
类是引用类型,结构体是值类型。
并没有通用的规定决定结构体和类哪一个更好用。
一般的建议是使用最小的工具来完成你的目标,但是有一个好的经验是多使用结构体,除非你用了继承和引用语义。
注意:在运行时,结构体在性能方面更由于类
原因是结构体的方法调用时静态绑定
而类的方法调用是动态实现的。
这就是尽可能得使用结构体替代类的一个好的原因。
optional
类型,它是用来解决什么问题
的?参考答案:
optional类型被用来表示任何类型的变量都可以表示缺少值。
在Objective-C中,引用类型的变量是可以缺少值的,并且使用nil作为缺少值。
基本的数据类型如int或者float没有这个功能。
Swift 用optional扩展了在基本数据类型和引用类型中缺少值的概念。
一个optional类型的变量,在任何时候都可以保存一个值或者为nil。
观察者模式
?参考答案:
观察者模式(Observer)是指一个或多个对象对另一个对象进行观察,
当被观察对象发生变化时,观察者可以直接或间接地得到通知,从而能自动地更新观察者的数据,或者进行一些操作。
具体到iOS的开发中,实现观察者模式常用的方式有KVO和Notification两种。
两种的不同在于
KVO是被观察者主动向观察者发送消息
Notification是被观察者向NotificationCenter发送消息,在由NotificationCenter post通知到每个注册的观察者。
分辨率
的计算单位
是什么?参考答案:
描述分辨率的单位有:
(dpi)点英寸
(lpi)线每英寸
(ppi)像素每英寸
状态栏
(Device Status Bar
)是什么?高度
如何?是否透明
?在手机通话或者导航状态下,它如何显示
的?参考答案:
iOS状态栏 就是指的最上面的20像素高的部分
状态栏分前后两部分:
前景部分:就是指的显示电池、事件等部分;
背景部分:就是显示黑色或者图片的背景部分;
选项卡(Tab Bar)
和工具栏(Toolbar)
分别是什么?两者之间有何共同点
和不同点
参考答案:
Tab Bar:提供一种机制来显示一个选项卡位于屏幕底部的工具栏和支持显示和选择的选项卡选项(UITabBarItem的实例)。你可以使用UITabBarDelegate指定自定义视图选项卡栏项。
Toolbar:提供一种机制来显示一个工具浏览在屏幕的底部和支持显示和选择的工具栏项目(UIToolbarItem的实例)。你可以使用UIToolbarDelegate指定自定义工具栏项目视图。
Table VIew
)是什么?集合视图(Collection View
)又是什么?参考答案:
UITableView:
UITableView继承于ScrollView,可以滚动。
UITableView的每一条数据对应的单元格叫Cell
UITableViewCell的一个对象继承于UIView
UITableView可以分区显示,每一个分区称为Section,每一行称为row,编号都从0开始。
UICollectionView:
fontUICollectionView是一种类似于UITableView 但又比UITableView功能更强大、更灵活的视图。
这是源于它将fontUICollectionView对cell的布局交给了UICollectionViewLayout,而且允许用户自定义layout来进行布局。
Picker View
适合存放哪类内容?What sort of content wouldbe appropriate to place in a picker view?参考答案:
UIPickerView控件在给用户选择某些特定的数据时经常使用到,比如选择性别/国家/地区等等。
标签
,文本域
和文本视图
?When are a label,textfield and textView appropriate?参考答案:
UILabel:显示只读文本。
最最基本的显示文字的,支持单行和多行,wrapped,truncated,styled。
UILabel是UIView的一个子类,而UIView又是UIResponder的子类,就使得UILabel支持:
position定位,color着色,maks掩码,access访问,触摸touch。
UITextView:可编辑文本,提供换行功能,支持多行时滚动。
允许垂直方向的滚动。文字是可选的,可以拷贝,可以选中后调用语音度出来。
UITextField:可编辑本文,但是无法换行,只能一行显示;
当点击键盘上的return时会收到一个事件做一些事情。
当内容太长一行没有完全显示时:提供水平方向的字符的定位seeking。
主要用于:简短的文字输入。
分段控件
?What does a segmented control do?参考答案:
SegmentedControl又被称分段控制器,是iOS开发中经常1用到的一个UI控件。
通常是在单视图中使用,不做多视图之间的切换。
实现视图中不同显示的快速切换,每一个分段表示一个不同的显示,这些显示往往是相关的,所谓的相关,可以理解成,功能一样,但是属性类别有差异。
比较常用的还有,在一个视图中,不同的分段控制tableview加载不同的数据源。
它通常在整个屏幕的上部,不是必然,但大部分情况下是这样用。
一般是3到5个分段,超过5个的话 每个分段的大小对于用户触碰的体验会很差。
任意时刻,只有一个分段是激活状态的。有点像单选按钮。
模态视图
?What is a modal View?参考答案:
模态视图和普通视图最主要的区别
就是模态视图显示的时候,不能对其他视图进行操作。
应用图标
是指什么?请尽可能详细地描述一下。参考答案:
每个app都需要一个漂亮的icon,依靠icon的外观来评价/确定一款app的质量、目的以及可靠性的用户并不在少数。
当你思考app icon设计的时候,需要记住几件事。
当你开始创造它的时候,要看看 App icon以获得详细地指南和说明。
icon是app品牌重要的一部分,icon设计为你提供了一个向用户讲述故事,和用户建立情感联系的机会。
最好的 app icon是独一无二的,是井然有序的,是迷人的。
不管在什么背景上,不管是什么尺寸, App icon的外观都应该很好看的。
细节会让大尺寸的icon变得丰富充实,但是会让小尺寸的icon看起来杂乱不堪。
启动画面
(Launch Images)参考答案:
什么是启动画面?
启动应用程序后,进入主功能界面前会有一张图片或一段动画效果,停留数秒钟后消失。
这张图片或这段动画效果 我们称之为应用的启动画面。
由于启动画面每次打开应用时都会出现,并且停留很短的时间。就像闪现的效果一样。
所以也有人把启动画面称之为闪屏。
为什么需要启动画面?
从用户体验的角度考虑,产品应当尽可能块的让用户进入程序并进行功能操作。
如此看来,启动画面就是多于的存在。
但是,应用程序本质上是有多种代码命令和数据组合而成的。
启动应用程序的过程实际上是运行代码和数据读取的过程,而这个过程是需要一定的时间的。
与其给用户看代码运行的过程,不如给用户展示的图片,这也是用户体验。
自动布局
(Auto Layou
t)的作用是什么?请概括以下它是怎么运行的。参考答案:
在iOS6中引入的Auto Layout,使你能够灵活的创建布局。
相对比使用autoresizingmasks 和手动布局的方式来布局程序的用户界面,Auto Layout将会是一个更好的选择。
你可以使用Auto Layout来给视图添加约束并且定义它们的关系。
这个关系可以是视图和它的父视图之间的,和兄弟视图之间的关系,甚至是它和之间的关系。
相对于之前的直接明确的设置视图的frame
Auto Layout可以使用约束来设定两个视图之间的间距和相对位置。
Auto Layout使用这些约束条件来计算用户视图上的元素在程序运行时的位置。
你必须给视图设置足够的约束条件以防止位置的模糊不清。
另外需要注意的是,设置过多的约束条件也会导致冲突甚至程序的崩溃。
map
函数
必不可少?该在什么情况下使用
它?参考答案:
map是一种基本的数据结构,它提供了很好一对一的关系。能够非常方便的进行查找,插入,删除,排序等等。
根据行为、效率、排序策略、保存对象的生命周期和预判”键“等价的策略等不同,可以衍生各种map。例如
HashMap、TreeMap、LinkedHashMap、WeakHashMap、identityHashMap。
UserDefaults
。就你而言,你会如何在磁盘中
对数组对象
进行序列化
?参考答案:
UserDefaults是系统自带的一个轻量级数据本地化的一个方法
其本质是一个单例。
用户名、密码、网址等都适合使用UserDefaults来储存。
对于自定义的对象需要对其归档才能储存。
Application
扮演着什么样的角色
?参考答案:
创建应用程序之后,默认有APPDelegate.swift文件。
APPDelegate为整个应用的一个代理,提供程序启动、退出等类似监控的接口,控制着应用的生命周期。
Metal
是什么?参考答案:
在iOS8里,苹果发布了一个新的接口叫做Metal,它是一个支持GPU加速3D绘图的API。
Metal和OpenGL ES相似,它也是一个底层API,负责3D绘画硬件交互。
它们之间的不同在于
Metal不是跨平台的。
与之相反的,它设计的苹果硬件上运行得极其高效,与OpenGL ES相比,它提供了更快的速度和更低的开销。
SpriteKit
和SceneKit
的作用。参考答案:
SpriteKit在iOS和OS X中均可使用,它使用主机设备提供的图形硬件来高帧速率合成2D图片,SpriteKit支持很多不同的内容,包括:
无纹理或者有纹理的举行(精灵)、文本、任意基于CGPath的形状和视频。
SpriteKit同时支持裁剪以及它的一些效果:
你可以将这些效果应用于所有或者一部分内容
你可以在每一帧中活动(animate)或者改变这些元素(element)。
你也可以附加物理主题(physics bodies)到这些元素中,使得它们支持推动和碰撞。
因为SpriteKit支持丰富的渲染结构并接管了所有向OpenGL发出绘画指令的底层工作(low level work),你可以将你额重新放在解决搞成此的设计问题以及伟大的游戏交互设计上。
SceneKit可以同时在iOS和 OS X下工作,是用来构建3D场景的框架
且可以与Core Animation和SpriteKit无缝交互。
在SceneKit可以直接引入COLLADA行业标准文件制作好的3D模型或场景。
core Audio
是什么框架
?参考答案:
Core Audio是iOS和MAC的关于数字音频处理的基础,它提供应用程序用来处理音频的一组软件框架。
所有关于iOS音频开发的接口都是由Core Audio来提供或者经过它提供的接口来进行封装的。
按照官方的说法是集 播放、音频处理、录制为一体的专业技术。
通过它我们的程序可以同时录制,播放一个或者多个音频流,自动适应耳机,蓝牙耳机等硬件,响应各种电话中断,静音,震动等,甚至提供3D效果的音乐播放。
Core Data
是什么框架
?参考答案:
Core Data框架提供了对象-关系映射(ORM)的功能,既能够将OC对象转化成数据,保存在sqlite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。
在此数据操作期间,不需要编写任何SQL语句。
Core Location
是什么框架
?参考答案:
Core Location Framework的用途是
使用户通过移动设备来获取定位信息和方向信息,
还有你的范围,当用户走过某些范围边界就能马上监控到,
在iOS上,甚至可以连同bencon联动来确定周边信息。
iBeacons
是什么?参考答案:
iBeacons是苹果在WWDC 2013上有意无意 透露出来的一项重要功能,通过低功率蓝牙(BluetoothLowEnergy)技术进行十分精确的微定位和室内导航,据悉其定位精度可以以厘米计算。
实现iBeacons精准的微定位功能除了需要运行iOS7且支持BLE的设备外,还需要在室内,店内或者其他公共环境中部署iBeacons基站
当用户走进信号覆盖区域内时,用户就会受到相关的提醒和询问。
以梅西百货为例,当用户走到商场某个店面附近时,安装了相应的app的用户就会受到由iBeacons基站发出的产品信息或者打折信息。
此外,美国职棒大联盟(MLB)也已经测试使用了iBeacons计数,苹果更是在254件App Store里面应用了 iBeacons技术。
对于开发者来说,可以创建一个更加具有交互性的博物馆应用。
当用户在博物馆内随意行走时,通过信息提醒用户某些特别的展览。
计数还可以用作室内导航,比如地铁站或者机场这些GPS信号不太好的地方更好地引导用户。
Game Center
针对iOS
游戏有哪些功能
?参考答案:
简单而言,Game Center提供了以下机制:
1.用户管理和验证:你的游戏不用再考虑用户注册,登录,密码找回。存储分数等繁琐的功能实现。
Game Center为你的游戏提供了一个本地玩家(local player),这个对象为所有的游戏共享。你需要调用即可。
2.排行榜:你需要在iTunesConnect中指定排行方式就可以轻松拥有一个或多个排行榜。
3.记录成就:你的游戏需要定义里程碑,调用Game Center就能保存进度;
4.挑战:Game Center提供了让玩家挑战其他玩家的机制。
HealthKit
是什么?参考答案:
HealthKit是Apple公司在推出iOS8系统时 一块推出的关于健康信息的框架。
如果iPhone手机升级到iOS8之后 就发现多了一个健康app。
这就是Apple提供的记录用户健康信息的app。可以用它来分享健康和健康数据。
还可以指定数据地来源,
比如我们自己创建一个app,在我们的app使用了HealthKit框架,之后只要经过用户的认证,就可以在我们的app之中给健康分享数据或者从健康中获取数据。
HealthKit可以与健康设备一起工作,iPhone手机自身可以监控步数信息,会自动导入步数信息。
但是其他信息或者设备需要配套的应该才能获取到数据并导入到HealthKit中并在健康中显示。
iOS
应用开发流程
?参考答案:
注册App ID
注册成为开发者
创建开发证书、发布证书
开发
真机测试
打包和发布
等待审核
上线
安全性
,保护用户隐私
信息的?参考答案:
要求使用https链接并验证证书的正确性
对用户敏感数据 使用密钥进行加密
对传输的内容进行加密
为了获取所在地(Location)数据,iOS8增加了一条新的While in USe许可项。
这意味着在未活跃的状态下,若有应用向访问所在地,就会弹出和该应用有关的警告信息。用户很方便地就可以取消该许可。
根据儿童网络隐私保护法案(COPPA),iOS8上的儿童应用必须有隐私政策,并作为”大致的规则“,不会收集任何形式的可识别某个人的有关信息。
这就意味着,儿童应用不应该有广告行为,也不应要求获取所在地、联系人、图像等要素。
Keychain和Touch ID在iPhone5s中就存在安全区域中了,而iOS8的这些特性却加强了很多隐私设置,尤其是当前设备使用Touch ID允许应用进入时,只能接触到设备本人,这会使用户的银行应用相对安全写。
performSelect:withObject:afterDelay:
内部大概是怎么实现的,有什么注意事项么?参考答案:
创建一个定时器,时间结束后 系统会使用 runtime通过方法名称(Selector本质即时方法名称)去方法列表中找到对应的方法实现并调用方法。
注意事项:
调用performSelect:withObject:afterDelay:方法时
先判断希望调用的方法是否存在 respondsToSelector:
这个方法是异步方法,必须在主线程调用,在子线程调用永远不会调用到想调用的方法
Core Animation
完成时,layer
又恢复到原先的状态?参考答案:
因为这些产生的动画只是 假象,并没有对layer进行改变。
那么为什么会这样呢,这里要讲一下图层树里的呈现树。
呈现树实际上是模型图层的复制,但是它的属性值表示了当前外观效果,动画的过程实际上只是修改了呈现树,并没有对图层的属性进行改变,所有在动画结束后图层会恢复原先状态。
tableview
的cell
改变时,如何让这些改变以动画的形式
呈现?参考答案:
[tableview beginUpdates];
[tableview endUpdates];
让我们来重点关注这行代码:[tableview beginUpdates];
文档中对这行代码的解释为让tableview产生插入,删除或重新加载cell。
和[tableview reloadData];是完成不一样的风格,
reloadData 这个方法会让tableview整体重新加载,相当于是作用在tableview上。
而beginUpdates 只是作用在cell上,这样看上去就像动画的形式显示cell的变化。
Push Notification
是如何工作
的?参考答案:
用户设备与苹果APNS服务器形成一个长连接,
用户设备会发送uuid和Bundle identifier给苹果服务器,
苹果服务器会加密生成一个devicetoken给用户设备,
然后设备会将devicetoken发送给app的服务器,
服务器会将devicetoken存进它们的数据库。
如果有人发送消息给某一个用户,
服务器端就会去查询该用户的devicetoken,
然后将devicetoken和要发送的消息发给苹果服务器,
苹果服务器通过devicetoken找到该用户的设备并将通知推送到设备上。
Objective-C
中,如何为Class
定义一个对外只读
内可读可写
的属性
?参考答案:
在头文件中将属性定义为readonly,
在.m文件中就属性重新定义为readwrite。
ViewController
瘦下来
?参考答案:
把DataSource和其他Protocol分离出来(UITableview或者UICollectionView的代码提取出来放到其他类中)
把业务逻辑移动到Model中(和模型有关的逻辑全部在model中写)
把网络请求逻辑移动到Model层(网络请求依靠模型)
把View代码移到View层(自定义View)
Crash
的场景?参考答案:
1.访问了僵尸对象
2.访问野指针
3.访问了不存在的方法
4.在定时器下一次回调前将定时器释放
autorelease
对象在什么情况下会被释放
?参考答案:
手动干预释放就是指定autoreleasepool,当前作用域大括号结束就立即释放。
系统自动去释放:不手动指定autoreleasepool,autorelease对象会在当前的runloop迭代结束时释放。
KFCRunLoopEntry(1):第一次进入会自动创建一个autorelease
KFCRunLoopBeforeWaiting(32):进入休眠状态前会自动销毁一个autorelease,然后重新创建一个新的autorelease
KFCRunLoopExit(128):推出runloop时会自动销毁最后一个创建的autorelease
内存警告
时会发生什么?参考答案:
会将不在当前窗口上的view暂时移除
如果放任内存警告,最终会导致软件强制被系统关闭
Toll-Free Bridging
是什么?什么情况下会使用
?参考答案:
Toll-Free Bridging 用于在 Foundation对象与Core Foundation对象之间交换数据,俗称桥接。
在ARC环境下, Foundation对象转成Core Foundation对象
使用__bridge桥接以后ARC会自动管理2个对象
使用__bridge_retained桥接需要手动释放Core Foundation对象
在ARC环境下,Core Foundation对象转成 Foundation对象
使用__bridge桥接,如果Core Foundation对象被释放, Foundation对象也同时不能使用了,需要手动管理Core Foundation对象
使用__bridge_transfer桥接,系统会自动管理2个对象
NotificationCenter
需要removeObserver
如何实现自动remove?参考答案:
如果不移除的话,万一注册通知的类被销毁以后又发了通知,程序会崩溃。
因为野指针发送了消息
实现自动remove
:通过自释放机制,通过动态属性将remove转移给第三方者,
解除耦合,达到自动实现remove
.block
实现原理
?参考答案:
Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。
从计算语言的发展,最早的goto,高级语言的指针,到面向对象的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出显示的逻辑(需求)。
__block
在arc
和非arc
下含义一样吗?参考答案:
在
MRC
中__block variable 在block
中使用是不会retain的
但是ARC
的__block则是会retain的。
取而代之是用__weak 或是 __unsafe_unretained 来更精准的描述 weak reference 的目的
其中前者只能在iOS5
之后可以使用,但是比较好(该物件release之后,此pointer会自动设成nil)
而后者是ARC
的环境下为了相容4.x的解决方案。
nonatomic
一定是线程安全
的吗?参考答案:
不是的。
atomic原子操作,系统会为setter方法加锁。
具体使用@synchronized(self){//code}
nonatomic 不会为setter方法加锁
atomic:线程安全,需要消耗大量系统资源来为属性加锁。
UIScrollView
大概是如何实现
的,它是如何捕捉
,响应手势
?参考答案:
UIScrollView在滚动过程中,其实是在修改原点坐标。
当手指触摸后,Scroll view 会暂时拦截触摸事件,使用一个计时器。
假如在计时器到点后没有发生手指移动事件,那么Scroll view 发送tracking events到被点击的subview。
假如在计时器到点前发生了移动事件,那么Scroll view 取消 tracking自己发生滚动。
Objective-C
中,meta-class
指的是什么?参考答案:
meta-class
是Class对象的类
为这个Class类存储类方法,当一个类发送消息时,就去那个类对应的meta-Class中查找那个消息。
每个Class都有不同的meta-class
,所有的meta-class
都使用基类的meta-class
(假如类继承NSObject),那么它所对应的meta-class
也就是(NSObject)作为它们的类。
iOS
的签名机制
大概是怎样的?参考答案:
签名机制:
先将应用内容通过摘要算法,得到摘要
再用私钥对摘要进行加密得到密文
将源文本、密文、和私钥对应的公钥一并发布
验证流程:
查看公钥是否是私钥方的
然后用公钥对密文进行解密得到摘要
将APP用同样的摘要算法得到摘要,两个摘要进行对比,如果相等那么一切正常。
以下过程只要有异步出问题,就视为无效。
View
的加载过程
?参考答案:
当程序访问了控制器的View属性时
会先判断控制器的View是否存在。
如果存在就直接返回已经存在的View;
如果不存在,就会先调用loadView这个方法;
如果控制器的loadView方法实现了,就会按照loadView方法加载自定义的view;
如果控制器的loadView方法没有实现就会判断Storyboard是否存在
如果Storyboard存在就会按照Storyboard加载控制器的view
如果Storyboard不存在,就会创建一个空视图返回。
参考答案:
大文件下载
注意事项
若不对下载的文件进行转存
,会造成内存消耗急剧升高
,甚至耗尽内存资源,造成程序终止
。
在文件下载过程中通常会出现中途停止
的情况,若不做处理
,就要重新开始下载,浪费流量
。
大文件下载的解决方案
对下载文件进行处理,每下载一点数据,就将数据写到磁盘中(通常是沙盒中),避免在内存累计数据(NSURLConnection下载)
使用NSFileHandle类实现写数据
使用NSOutputStream类实现写数据
当下载任务终止时,记录任务终止时的位置信息,以便下次开始下载
谓词
?参考答案:
谓词
是通过NSPredicate
。
是通过给定的逻辑条件作为约束条件 ,完成对数据地筛选 。
Core Data
或者SQLite
吗?读写是分线程
的吗?遇到过死锁
没?如何解决的?参考答案:
使用
NSLock
加锁
NSManagedObject
模型?参考答案:
NSManagedObject
是NSObject
的子类,也是coredata的重要组成部分,
它是一个通用的类
。实现了core data模型层所需的基本功能。
用户可通过子类化NSManagedObject
,建立自己的数据模型。
MD5
和Base64
的区别是什么,各自场景是什么?参考答案:
md5:
用户密码存储
文件效验
base64 : 公开的代码加密url加密
SDWebImage
原理参考答案:
从
内存
中(字典
)找到图片(当这个图片在本次程序加载过),找到直接使用。
从沙盒
中找,找到直接使用,缓存
到内存
。
从网络
上获取,使用,缓存
到内存
,缓存
到沙盒
。
单例模式
的作用参考答案:
单例模式
的作用是解决”应用中只有一个实例“的一类问题。
dispatch_once函数是由GCD
提供的。它的作用是在这个应用程序生命周期中只执行一次代码块。
dispatch_once_t是由GCD
提供的结构体,使用时需要将GCD地址传给dispatch_once函数。
dispatch_once 函数能够记录该代码是否被调用过。
dispatch_once 函数不仅意味这代码仅会被执行一次,而且还意味着此运行还是线程同步的。
也就是说,当我们使用dispatch_once函数时,就不需要再使用诸如@synchronized
之类的语句。
程序
中有哪些常见的单例
?参考答案:
UIApplication、
NSUserDefault、
NSNotificationCenter,
NSFileManager、
NSBundle
VIewController
的loadView
、ViewDidLoad
、viewDidUnload
分别是在什么时候调用的?参考答案:
ViewDidLoad在view从nib初始化调用。
loadView在Controller的view为nil时调用。
此方法在编程实现view是调用,view控制器默认会注册memory warning notification,
当VIewController的任何view没有用的时候 ,viewDidUnload会被调用
在这里实现将retain的view release,
如果是retain的IBOutlet view属性则不要在这里release
IBOutlet会负责release。
Quatrz 2D
的绘图
功能的三个核心
概念是什么并简述其作用?参考答案:
上下文
:主要用于描述图形写入哪里
路径
:是在图层上绘制的内容
状态
:用于保存配置变换的值、填充赫尔轮廓、alpha值等
UITabbarController
的原理?参考答案:
运用字典
,
点击五个按钮的一个可以从字典选择一个控制器对象,将其View显示到主控制器视图上。
沙盒
的理解?参考答案:
每个iOS应用都被限制在”
沙盒
“中
沙盒
相当于一个加了仅主人可见权限的文件夹
及时在应用程序安装过程中,系统为每个单独的应用程序生成它的主目录和一些关键的子目录。
苹果对沙盒
有几条限制:
应用程序在自己的沙盒中运作,但是不能访问任何其他应用程序的沙盒。
应用之间不能共享数据,沙盒里的文件不能被复制到其他应用程序的文件夹中,也不能把其他应用文件夹复制到沙盒中;
苹果禁止任何读写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中。
LayoutSubViews
在什么时候被调用
?参考答案:
当View本身的
frame改变
时,会调用这个方法
二叉搜索树
的概念,时间复杂度
是多少?参考答案:
采用二叉树链表作为
存储结构
,每个左节点均小于父节点,每个右节点均大于父节点。
时间复杂度:O(log2(n))
静态库
/动态库
,它们的区别是什么?参考答案:
无论是动态库还是静态库都是区分
真机
和模拟器
的,需要lipo命令进行合并。
静态库编译静态库文件装入程序空间,动态库是文件动态装入内存。
动态库执行到相关函数才会被调用,节省空间。
isMemberOfClass
和 isKindOfClass
联系
与区别
是什么?参考答案:
联系
: 两者都能检测一个对象是否是某个类的成员
区别`:
isKindOfClass
不仅用来确定一个对象是否是一个类的成员,
也可以用来确定一个对象是否派生自该类的类的成员。
而isMemberOfClass 只能做到第一点。
Fiboacci
数列:intF(intn):参考答案:
Fiboacci数列递推式F(n)= F(n-1)+F(n-2) F(1) = 1 F(2) = 2 F(3) = 3 F(4) = 5 F(5) = 8 int F(int n){ if(n==1){ return 1; } return f(n-1)+f(n-2); }
参考答案:
例如:Array A = [1,3,5,6,9],Array B = [2,4,6,8,10] 返回结果=[3,6] void FindCommon(int *a,int *b,int n){ int i = 0; int y = 0; while (i < n && j< n){ if(a[i] < b[j]){++i;}else if (a[i] == b[j]){ cout << a[i] << endl; ++i; ++j; }else{ ++j; } } }
KVO
的实现原理
参考答案:
当指定的
对象
的属性被修改了
,允许对象
接收到通知
的机制。
私有属性
赋值
?参考答案:
利用
KVC
即键值编码来给对象
的私有属性
赋值
。
block
的本质
是什么?为啥在block
里面改外面的变量的值,要给外面的变量加__block修饰
,加__block
修饰
的原理
是什么?参考答案:
1.
block本质
是一个数据类型,多用于参数传递,代替代理方法。
(有多个参数需要传递或多个代理方法需要实现还是推荐代理方法),
少用于当做返回值传递。
block
是一个OC对象,它的功能是保存代码块
,预先准备好代码,并在需要的时候执行。
2.因为使用block代码块可能会引起内部循环引用
,所以应在block定义前面加上修饰。
NSURLSession
在什么情况下会存在循环引用
的问题,怎么解决
?参考答案:
1.使用
NSURLSession
签订其代理的时候会存在循环引用问题,因为其代理是retain强引用
2.解决方案
2.1在下载完成后取消NSURLSession会话,并释放session,赋值为nil
2.2在视图将要消失也执行同样的操作。为了防止没有下载完成就跳转控制器。
参考答案:
1.使用GET请求数据
2.iOS系统SDK已经做好了缓存。需要的仅仅是
设置下内存缓存大小、磁盘缓存大小、以及缓存路径,
代码如下NSRULCache *urlCache = [[NSRULCache alloc]initWitMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil]; [NSRULCache setSharedURLCache:urlCache];
SQLite
过程中,如果多条线程
同时操作
同一数据库
会造成什么问题,怎么解决?参考答案:
1.容易造成系统崩溃
2.解决方案:开启第3种串行模式,使用一个类(单例模式)操作数据库。
GCD
中线程之间
怎么通讯
?请举例说明。参考答案:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) ,^{ // 下载图片 UIImage *image = nil; dispatch_async(dispatch_get_main_queue(),^{ // 回到主线程 }); } );
NSThread
的线程
之间如何通信
?请举例说明参考答案:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) ,^{ // 下载图片 UIImage *image = nil; [self performSelector:@selector(settingImage:) onThread:[NSTread mainThread]withObject:image waitUntilDone:YES modes:nil]; } );
网络图片
处理问题中怎么解决一个相同的网络地址重复
请求的问题。参考答案:
利用
字典
图片地址
作为key
,下载操作
作为value
。
自动释放池底层
怎么实现
?参考答案:
参考答案:自动释放池以栈的形式实现:
当你创建一个新的自动释放池
时,它将被添加到栈顶
当一个对象受到发送autorelease
消息时,它被添加到当前线程的处于栈顶的自动释放池
中,
当自动释放池被回收时,它们在栈中被删除
,并且会给池子里面所有的对象都会做一次release
操作。
中间变量
,用两种方法交换A和B的值
?参考答案:
A = A + B; B = A - B; A = A - B;
#define
声明一个常数,用以表明一年中有多少秒?(忽略闰年问题)参考答案:
#define second 365 * 24 * 60 * 60
多个架构
(simulator
,arm7
,arm64
)的通用静态库?参考答案:
VaildArchitectures 设置为: armv7 | armv7s | arm64 | I386 | X86_64;
Architectures 设置不变(或根据你需要): armv7 | arm64;
然后分别选择iOS设备额模拟器进行编译,最后找到相关的.a进行合包。
使用lipo - create 真机库.a路径 模拟器库.a的路径 -output 合成库的名字.a <<—终端指令;
@class
用途参考答案:
@class一般用于头文件中声明
某个类的实例变量的时候用到
。
它只是声明
,至于内部实现是没有告诉编译器的。
支持某个method
。参考答案:
if([s respondsToSelector:@selector(print:)]){ [s print:@"支持这个方法"]; }
3升
的杯子一个,5升
的杯子一个,杯子的形状不规则。问怎么才能得到4升
的水。水无限多。参考答案:
先将5升的杯子倒满,然后把5升的杯子中的水倒入3升的杯子。倒满后5升的杯子剩下2升。
再讲3升的杯子中的水倒掉。把5升的杯子中剩余的2升水倒入3升的杯子中。然后把5升的杯子倒满。
再用5升的杯子中的水给3升的杯子填满,则5升的杯子中剩余升的水。
多个网络请求
并发
的情况?参考答案:
了解(并发)当有多个线程在操作时,如果系统只有一个CPU,
则它根本不可能真正同时进行一个以上的线程,
它只是把CPU运行时间
划分
若干个时间段
,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,
其它线程是处于挂起状态。这种方式我们称之为并发(Concurrent)
.
遇到这种情况建议使用第三方的网络库。
比如
AFNetworking、也可以通过GCD和NSOPerationQueue来控制并发。
KVC
和KVO
,它们都可以应用
哪些场景
?参考答案:
KVO:键值监听,观察某一属性的方法
KVC:键值编码,是一种间接访问对象的属性
Plist
文件?参考答案:
Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息,该功能在旧式的
Mac OS
中是由资源分支提供的。
Plist主要有Core Foundation
类型构成,也可以将这些类型放入NSDictionary
和NSArray
以便后藤更复杂的数据类型
Core Foundation
框架
,什么是Foundation
框架
?参考答案:
Core Foundation框架(
CoreFoundation.framework
)是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。
Foundation-基础框架,框架包含了很多开发中常用的数据类型,如结构体、枚举、类等,是其他iOS框架的基础。
如果要想使用Foundation框架的数据类型,那么包含它的主头文件就可以了。
内存管理
是怎样的?参考答案:
Swift使用自动引用计数(Automatic Reference Counting,ARC)来简化内存管理。
面向过程编程
吗?参考答案:
它采用了Objective-C的命名参数以及动态对象模型。
可以无缝对接到现有的Cocoa框架,并且可以兼容Objective-C代码。
支持面向过程编程和面向对象编程。
Objective-C
中没有的?参考答案:
Swift引入了Objective-C中没有的一些高级数据类型,例如tuples(元组),可以使你创建和传递一组数值。
Swift还引入了可选项类型(Optionals),用于处理变量值不存在的情况。
可选项的意思有两种:
一是变量是存在的,例如等于X
二是变量根本不存在。
Optionals类似Objective-C中指向nil的指针,
但是适用于所有的数据类型,而非仅仅局限于类。
Optionals相比于Objective-C中nil指针更加安全和简明,并且也是Swift诸多最强大功能的核心。
Swift
是一门安全
语言吗?参考答案:
Swift是一门类型安全的语言。
Optionals就是代表。
Swift能帮助你在类型安全的环境下工作,如果你的代码中需要使用String类型,
Swift的安全机制能阻止你错误的将Int值传递过来,这使你在开发阶段就能及时发现并修正问题。
变量
和常量
?参考答案:
使用let来声明常量,使用var来声明变量。
定义
一个数组
和字典
?参考答案:
let emptyArray = String[]() let emptyDictionary = Dictionary<String,Float>()
变量类型
后面加个问号
?参考答案:
用来标记这个变量的值是
可选的
交换数组
中的两个元素
?参考答案:
func swap<T>(_ nums: inout[T], _ p: Int, _ q:Int){ (nums[p],(nums[q])) = (nums[q],(nums[p])) }
Swift
中定义变量
和Objective-C
中定义常量
有什么区别?参考答案:
一般人会觉得没有差别,因为写出来好像也确实没差别。
OC是这样定义常量的:
const int number = 0;
Swift 是这样定义常量的:
let number = 0
首先第一个区别,OC用const来表示常量,
而Swift中用let 来判断是不是常量。
上面的区别更进一步说,OC中const表明的常量类型和数值 compilation time 时确定的;
而Swift中let 只是表明常量(只能赋值一次),其类型和值即可以是静态的,也可以是一个动态地计算方法,它们在runtime时确定的。
Swift
到底是面向对象
还是函数式
的编程语言?参考答案:
说Swift是Object-oriented,是因为Swift支持类的封装、继承和多态,从这点上来看与Java这类纯面向对象的语言 几乎毫无差别。
说Swift是函数式编程语言,是因为Swift支持 map、reduce、filter、flatmap这类去除中间状态数学函数式的方法。隔年强调运算结果而不是中间过程。
扩展
添加存储属性
吗?参考答案:
这个不可能的。
扩展可以为已经存在的数据类型添加新的行为,
但是不允许改变类型本身或它的接口。
如果你添加了存储的属性,你需要额外的内存来存储新的值。扩展不能完成这样的任务。
闭包
是值类型
还是引用类型
?参考答案:
闭包是引用类型。如果一个闭包被分配给一个变量,该变量被复制到另一个变量,它们实际是引用的相同一个闭包并且它里面的参数列表也同样会被复制。
Optional
(可选型)是怎么实现
的?参考答案:
在Objective-C并没有Optional类型,只有nil,并且只能用于表示对象类型无值,
并不能用于基础类型(int,float),枚举和结构体,基本类型需要返回类似NSNotFound的特殊值来表示无值,
所以在Swift中定义了Optional类型来表示各种类型的无值状态,并规定了nil不能用于非可选的常量和变量,只能用于Optional类型。
参考答案:
[1,2,3]是阵列的语法,意义为字面上表示为
Array
的阵列
Trailing Closures
。如果一个函数的最后一个参数是闭包时,则可以不写().
省略闭包参数的类型声明,其被推断为Int。
$0表明是阵列中的每一个元素,省略了闭包参数的命名。
省略了闭包回传值类型的声明,其被推断为Int。
若闭包只有一行,则可以省略return。