作者丨_小米虎
介绍
过完年,相信已经有人磨刀霍霍去大公司了。 他们必然会在大公司中大展身手,开创一片天地。 不过,相信大家都知道,近年来最严重的互联网寒冬即将到来,所有兄弟都将“告别世界”。 耳边总有传言,比如这个地方要裁员,HC这个地方要裁减。 让人感到恐慌。 过完年,血雨腥风,编程的世界在这一天绚丽多彩。
但我们要知道,在寒冷的冬天,什么才是最珍贵的。 我告诉你:天赋。 只要我们有扎实的技术和装备,即使在不利的条件下,我们也能迎难而上,出其不意。 李云龙哥哥不是说过:“两人狭路相逢,勇者胜。”
这几天,我看到朋友们到处打拼,经过千辛万苦,终于获得了第一名,收到了很多大公司的offer。
我感谢您的善意和深厚的感情。 我给了你iOS面试指南供你学习。 经过反复研究和整理,现分享给大家,希望和大家一起学习、研究。 首先我要说的是,面试虽然有技巧,但我们绝对不是吹牛,也不是造假。 我们应该花一些时间闭关修行。 等我们出关,一定会进大公司,工资翻倍。 是不是很棒啊! ! !
了解规则
作为一名优秀的程序员,你绝对不会把时间浪费在:
1、没有晋升、没有职业发展的公司
第二:我们不会停留在一定的技术水平而不进步
3.我愿意付出真心,你却不愿意对待我的公司
这篇博客包含很多知识点。 当你花一些时间把它们一一理解、背下来之后,你自然就能够驾轻就熟,无所畏惧了。 面试 iOS 只需几分钟。
本书旨在方便记忆,帮助你快速进入考试状态,类似于复习大纲。 知识点会尽可能的简化和提炼,不会深入细节,也不会面面俱到。 如果您有兴趣或者有疑问,可以Google一下相应知识点的详细信息。
1.Swift和OC的区别
(1) Switch没有地址指针的概念
(2) 泛型
(3) 类型严格性 vs. OC 的动态绑定
2.编译并连接
id和instancetype的区别
instancetype只能在编译时确定返回值的实际类型,不符合要求会发出警告
特殊情况:关联类型返回方法,例如类方法 lloc 或以 new 开头、以 autorelease、init、retain 或 self 开头的实例方法
3. 合成与动态化
1:通过@sythesize
指令告诉编译器在编译期间生成 getter/setter 方法。
2:通过@dynamic指令自己实现该方法。
有些访问器是在运行时动态创建的,例如在 CoreData 的 NSManagedObject 类中。
4、项目开发中常用的开发工具有哪些?
乐器
超越比较
git
5. UlTableView 和 UlCollection
UlCollectionView是iOS6中引入的新API。 它用于显示集合视图。 它的布局更加灵活,用法与UITableView类似。
UICollectionView、UlCollectionViewCell 和 UITableView、UITableViewCell 在用法上有异同。
下面是一些基本的使用方法:对于UITableView来说,只需要UITableViewDataSource和UITableViewDelegate协议
要使用UlCollectionView,您需要实现:
UICollectionViewDataSource,UlCollectionViewDelegate,
UlCollectionViewDelegateFlowLayout 这三个协议。
这是因为 UlCollectionViewDelegateFlowLayou 实际上是 UCollectionViewDelegate 的子协议,它继承
UlCollectionViewDelegate,它的作用是提供一些定义UlCollectionView的布局模式的函数
6. NSProxy & NSObject
NS对象:
NSObject 协议组适用于所有 Object-C 对象。 如果一个对象符合协议,则它被认为是一流的。
另外,符合该协议的对象的retain、release、autorelease等方法也受Foundation中定义的对象和release方法的管理。 - 容器中的一些对象也可以管理这些
对象,例如 NSArray 和 NSDictionary 定义的对象。 Cocoa的根类也遵循这个协议,所以所有继承NSObjects的类
对象都具有遵循该协议的特性
NSProxy:NSProxy 是一个虚拟基类,它为对象定义 API,这些对象的行为类似于其他对象的代理或不存在的对象。 通常,发送到代理的消息被转发到真实对象,或者代理本身加载(或将其自身转换为)真实对象。
NSProxy 基类可用于透明消息转发或昂贵对象的延迟初始化。
7. 对象与 Swift
Objective-C语法复杂,但使用起来比较简单,前景光明,这让很多开发者兴奋不已。
Apple 声称 Swift 快速、现代、安全、交互式,并且明显优于 Objective-C。
可以使用现有的 Cocoa 和 Cocoa Touch 框架
Swift 消除了 Objective C 中指针和其他不安全访问的使用
放弃了 Objective C 中使用的 Smalltalk 语法,完全转换为句点表示法,提供了类似 Java 的命名空间。
泛型、运算符重载,Swift 被简单地描述为“没有 C 的 Objective-C”,并将 Xcode 引入了 Apple 的开发工具。
Playgrounds,强大的交互功能,可以让 Swift 源代码在编写的同时实时显示其运行结果;
基于C和Objective-C,但没有C的一些兼容性限制; 采用安全的编程模型; 界面基于Cocoa和Cocoa Touch框架; 保留了Smalltalk的动态特性
8. 价值转移通知和推送通知(本地和远程)
传值通知:类似于通知、代理、Block实现值得传值
推送通知:本地通知推送到用户手机上相应的App(主要是不再处于前台时)。
本地通知用于基于时间的通知,例如与日历或待办事项列表相关的小型应用程序。 此外,如果一个应用程序在后台执行,并且iOS允许它在有限的时间内运行,它也会发现本地通知很有用。 例如,在后台运行的应用程序从应用程序的服务器获取消息。 当消息到达时,例如提示下载更新版本,将通过本地通知机制通知用户。
本地通知是 UILocalNotification 的一个实例,它具有三个主要属性:
Scheduled time,时间段,用于指定iOS系统发送通知的时段和时间;
通知类型,包括警告信息、操作按钮的标题、应用程序图标上的徽章(数字标记)以及播放的声音:
自定义数据,本地通知可以包含字典类型的本地数据。
关于本地通知的数量,iOS 最多允许 64 个最近的本地通知。 超出限制的本地通知将被 iOS 忽略。 远程通知(需要服务器)流程大致是这样的
1.生成CerticateSigningRequest. certSigningRequest文件
2.将CertilicateSigningRequest.certSigningRequest上传进developer,导出.cer文件
3.利用CSR导出P12文件
4.需要准备下设备token值(无空格)
5.使用OpenSSL合成服务器所使用的推送证书
一般使用极光推送时,步骤都是一样的,只不过我们使用的服务器是极光的,所以不需要自己的大型服务器!
9. 第三方库和第三方平台
第三方库:
一般指大佬封装的框架(库),或者第三方提供给我们的库。 这是一个更通用的*第三方平台:
指第三方提供的某些服务。 其实很多方面和第三方库是一样的,但是还是有一些区别的。
区别:库:AFN、ASI、Alomofire、MJRefresh、MJExtension、MBProgressHUDP平台:极光、百度、友盟、Mob、欢信
imageName 和 mageWithContextOfFile 有什么区别? 哪一款性能更好?
(1)用imageNamed加载时,图片使用后会缓存在内存中,消耗内存较多,加载速度较快。 即使生成的对象被autoReleasePool释放,缓存也不会被释放。 如果图像较大或图像较多,此方法会消耗大量内存。
imageNamed 使用缓存机制。 如果图片已经加载到缓存中,则可以直接从缓存中读取。 不需要每次都重新读取文件,效率会更高。
(2)ImageWithContextOfile加载,图片不会被缓存,加载速度慢。
(3)大量使用imageNamed方法会在不需要缓存的地方增加CPU时间。 当应用程序需要加载一个比较大的图像并使用一次时,实际上没有必要缓存这个图像。 使用 imageWithContentsOfile 是最经济的方法。 当Ullmage元素较多时,这样就不会在不必要的缓存上浪费太多时间。
10. NSCache 和 NSDictionary
NSCache 在几个方面与可变集合不同:
NSCache类结合了各种自动删除策略,保证不占用过多的系统内存。 如果其他应用程序需要内存,系统会自动执行这些策略。 当调用这些策略时,一些对象会从缓存中删除,以最大限度地减少内存使用。
NSCache是线程安全的,我们可以在不同的线程中添加、删除、查询缓存中的对象,而无需锁定缓存区域。
与 NSMutableDictionary 对象不同,缓存对象不会复制关键对象。
NSCache 与 NSDictionary 类似,只不过它会在系统回收内存时自动删除其内容。
(1)可以存储(当然使用内存)
(2)保持强大的应用,忽略垃圾收集。 => 这类似于具有固定客户的 NSMutableDictionary (3)。
11、UlView的setNeedsDisplay和setNeedsLayout方法
在Mac OS中,NSWindow的父类是NSResponder,而在iOS中,UIWindow的父类是UIVIew。 一个程序通常只有一个窗口,但可能有多个视图。
UlView的作用:绘图和动画。 视图负责绘制所属的矩形区域、布局和子视图管理、事件处理,可以接收触摸事件、事件信息载体等。
UIViewController 负责创建它管理的视图,并在内存不足时将它们从内存中删除。 它还响应标准系统操作。
layOutSubViews可以在自己的自定义视图中重载该方法来调整子视图的大小和位置。
UIView的setNeedsDisplay(需要重新显示、绘制)和setNeedsLayout(需要重新布局)方法。 首先,这两个方法都是异步执行的。 而setNeedsDisplay会自动调用drawRect方法,这样就可以获得UIGraphicsGetCurrentContext,就可以进行绘制了。 而setNeedslayout默认会调用layoutSubViews,这样就可以在子视图中处理一些数据了。
综上,setNeedsDisplay方便绘制,而layoutSubViews方便数据setNeedDisplay通知view发生了变化,需要自己重绘,相当于刷新界面
12.UILayer 和 UiView
UlView是iOS系统中界面元素的基础,所有界面元素都继承自它。 完全由CoreAnimation实现(Mac上好像不是这样)。 它真正的绘图部分是由一个叫做CAL ayer(核心动画层)的类来管理的。 UIView本身更像是一个CAL ayer管理器。 当您访问其绘图和坐标相关的属性(例如框架、边界等)时,您实际上是在访问其包含的 CAL 层的相关属性。
UIView有一个重要的属性层,它可以返回其主CAL ayer实例。
UIView的CALayer类似于UIView的子View树结构,也可以在其层上添加子层来完成一些特殊的表示。 即CALayer层是可以嵌套的。
UIView树在系统内部分为三层维护:逻辑树,可以通过代码操作; 动画树,它是系统更改属性并执行各种渲染操作的中间层; 显示树,其内容当前显示在屏幕上。
动画如何工作:当您更改UMiew的子图层(非主图层)属性时,系统将自动生成动画。 动画持续时间的默认值似乎是 0.5 秒。
坐标系:CAL ayer的坐标系比UIView多了一个anchorPoint属性,用CGPoint结构体来表示。 取值范围为0~1,为比例值。
渲染:更新图层时,更改可能不会立即在屏幕上可见。 当所有图层都准备好后,您可以调用setNeedsDisplay方法来重绘显示。
变换:要将 3D 或仿射变换添加到图层,请分别设置图层的 Transform 或 FineTransform 属性。
变形:Quartz Core 的渲染功能可以让二维图像像三维图像一样自由操纵。 图像可以在三维坐标系中以任意角度旋转、缩放和倾斜。 CATransform3D的一组方法提供了一些神奇的变换效果。
13. 布局子视图和绘制矩形
以下情况会调用layoutSubviews(触发视图位置变化):
1、init初始化不会触发layoutSubviews。
2、addSubview会触发layoutSubviews。
3、设置Vview的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
4、滚动一个UISCrollView会触发layoutSubviews。
5、旋转Screen会触发父UIView上的layoutSubviews事件。
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
7、直接调用setLayoutSubviews。
在以下情况下会调用drawRect:
1.如果UIView初始化时没有设置矩形大小,则不会自动调用drawRect。 在Controller->loadView和Controller->viewDidLoad之后调用drawRect。 所以不用担心,这些View的drawRect将会在控制器中开始绘制。 这样就可以为控制器中的View设置一些值(如果绘制这些View时需要一些变量值)。
2. 该方法是在调用sizeToFit之后调用的,所以可以先调用sizeToFt来计算尺寸。 然后系统自动调用drawRect:方法。
3. 通过将contentMode属性设置为UIViewContentModeRedraw,每次设置或更改rame时都会自动调用drawRect。
4、直接调用setNeedsDisplay,或者setNeedsDisplaylnRect:触发drawRect,但有一个前提,就是rect不能为0。
使用drawRect方法的注意事项:
1、如果使用UIView进行绘制,只能在drawRect:方法中获取对应的contextRef并进行绘制。 如果通过其他方法获取它,您将得到一个无效的引用,并且无法使用它进行绘图。
无法手动调用drawRect:方法。 必须调用setNeedsDisplay或setNeedsDisplaynRect让系统自动调用该方法。
2、如果使用CALayer进行绘制,则只能在drawInContext:(类似drawRect)中或者在delegate中对应的方法中进行绘制。 您还可以通过调用setNeedDisplay来间接调用上述方法。
3.如果要实时绘图,不能使用HgestureRecognizer。 只能通过touchbegan等方法使用setNeedsDisplay来实时刷新屏幕。
14.UDID和UUID
UDID是Unique Device ldentifer的缩写,中文意思是唯一设备标识符。
它经常用于许多需要将一台设备限制为一个帐户的应用程序中。 在Symbian时代,我们使用IMEI作为设备的唯一标识符。 不幸的是,苹果不允许开发者获取设备的IMEI。
lUlDevice currentDevice uniqueidentie]
但我们需要注意的一件事是,对于越狱设备来说,UDID 并不是唯一的。 使用Cydia插件UDIDFaker,可以为每个应用程序分配不同的UDID。 因此,UDID 不再用作唯一设备标识符。
UUID是Universally Unique Identifier的缩写,中文意思是通用唯一标识符。 据网上资料显示,UUID是软件构建的标准,也是开放软件基金会(OSF)组织的分布式计算环境(DCE)的一部分。 UUID的目的是让分布式系统中的所有元素都拥有唯一的标识信息,而不需要中央控制终端来指定标识信息。
15.CPU和GPU
CPU:中央处理单元(CentralProcessingUnit)是计算机的计算和控制核心。 CPU、内存和输入输出设备是电子计算机的三个核心部件。 它的主要功能是解释计算机指令并处理计算机软件中的数据。
GPU:GraphicProcessingUnit,翻译成中文为“图形处理器”。 专用图形核心处理器。 GPU是显卡的“大脑”,决定了显卡的档次和大部分性能。 这也是区分2D显卡和3D显卡的依据。 2D显示芯片在处理3D图像和特效时主要依靠CPU的处理能力,称为“软加速”。 3D显示芯片将三维图像和特效处理功能集中在显示芯片中,也就是所谓的“硬件加速”功能。
结论
由于书的内容太长,我就不一一介绍了,就先到这里吧!
推荐↓↓↓
长的
根据
关闭
笔记
【】都在这里!
涵盖:程序员大师、源码阅读、程序员阅读、数据结构与算法、黑客技术与网络安全、大数据技术、前端编程、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研究与开发、幽默的程序员等等。
爱一直都在,可以点个“赞”吗
评论列表