资料梳理-- XX YY
1.@synthesize && @dynamic
@synthesize,编译器自动生成setter和getter的方法,在你没有手动去实现这两个方法时。
@dynamic,告诉编译器你会动态生成setter和getter方法,不会要编译器帮你生成。
2.NSProxy && NSObject
NSProxy应用
3.NSCache && NSDictionary
构建缓存时使用--NSCache而非NSDictionary的理由:
- 当系统资源将要耗尽的时候,NSCache可以自动删减缓存,而且线性删减"最久未使用的"对象,NSCache是不是很强大。但是NSDictionary就需要在系统发出"低内存"通知时手工删减缓存,还需要自己编写相应优先删减内存等一系列逻辑。
- NSCache是线程安全的,可以在供多个线程同时访问NSCache但是NSDictionary就不具备此优势
- NSCache对象不拷贝键,因为很多时候键都是由不支持拷贝操作的对象来充当的,因此NSCache不会自动拷贝
4.UILayer && UIView
所有的 view 都是由一个底层的 layer 来驱动的,layer侧重于图形的显示,而view相当于layer的管理者
- 响应事件:从UIView和CALayer的定义可以看出UIView是继承于UIResponder,而CALayer是继承于NSObject。在iOS中,UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理。所以UIView可以响应事件,而CALyer则不能响应事件。
- 初始化Frame:一个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的frame 只是简单的返回 Layer的 frame,同样 View 的 center和 bounds 也是返回 Layer 的一些属性
- 内容管理和绘制:UIView主要是对显示内容的管理,而CALayer主要是对显示的绘制
- 隐式动画:每个view都有一个layer,但是也有一些不依附view单独存在的layer,如CAShapelayer。它们不需要附加到 view 上就可以在屏幕上显示内容。
UIView
默认情况下禁止了layer
动画,但是在animation block
中又重新启用了它们。当layer
在背后支持一个view
的时候,view
就是它的delegate
。
每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有
SubLayers
,View 内部有SubViews
.但是 Layer 比 View 多了个AnchorPoint
在 View显示的时候,UIView 做为 Layer 的
CALayerDelegate
,View 的显示内容取决于内部的 CALayer 的display
CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过
actionForLayer:forKey:
向 View请求相应的action
(动画行为)layer 内部维护着三分
layer tree
,分别是presentLayer Tree
(动画树),modeLayer Tree
(模型树),Render Tree
(渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer
两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以
5.layoutSubViews && drawRect
layoutSubViews 这个方法是用来对
subviews重新布局
,默认没有做任何事情,需要子类进行重写。当我们在某个类的内部调整子视图位置时,需要调用。
- - (void)layoutSubviews; //对subview重新布局
- - (void)setNeedsLayout; //将视图标记为需要重新布局,
这个方法会在系统runloop的下一个周期自动调用layoutSubviews。
- - (void)layoutIfNeeded; //如果有需要刷新的
标记
,立即调用layoutSubviews进行布局(如果没有标记,不会调layoutSubviews)layoutSubViews 调用时机
- init初始化不会触发layoutSubviews。
- addSubview会触发layoutSubviews。(当然这里frame为0,是不会调用的,同上面的drawrect:一样)
- 设置view的Frame会触发layoutSubviews,(当然前提是frame的值设置前后发生了变化。)
- 滚动一个UIScrollView会触发layoutSubviews。
- 旋转屏幕会触发父UIView上的layoutSubviews事件。(这个我们开发中会经常遇到,比如屏幕旋转时,为了界面美观我们需要修改子view的frame,那就会在layoutSubview中做相应的操作)
- 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
- 直接调用setLayoutSubviews。(Apple是不建议这么做的)
绘图操作是在UIView的drawRect中完成的,我们想要在UIView中完成绘图(或者自定义控件),需要在UIView的拓展类(或者子类)中重写drawRect函数,在这里进行绘图的操作,系统会自动调用该函数进行绘图。
- - (void)drawRect:(CGRect)rect; //重写此方法,执行重绘任务
- - (void)setNeedsDisplay; //将视图标记为需要重绘,异步调用drawRect
- - (void)setNeedsDisplayInRect:(CGRect)rect; //将视图标记为需要局部重绘
drawRect调用时机
- 调用时机:loadView ->ViewDidload ->drawRect:
- 如果在UIView初始化时没有设置rect大小,将直接导致drawRect:不被自动调用。
- 通过设置contentMode属性值为UIViewContentModeRedraw。那么将在
每次设置或更改frame
的时候自动调用drawRect:
。- 直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是:
view当前的rect不能为nil
- 该方法在调用sizeThatFits后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
这里简单说一下sizeToFit和sizeThatFit:
sizeToFit:会计算出最优的 size 而且会改变自己的size。
sizeThatFits:会计算出最优的 size 但是不会改变 自己的 size
6.UDID && UUID
- Unique Device Identifier :设备唯一标识符,用来唯一识别某台设备。在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识的,可惜的是Apple官方不允许开发者获得设备的IMEI.
- Universally Unique Identifier :通用唯一标识符,它能让你在不同地点,不借助中央服务器的情况下为任何项目创建唯一的标识符。例如:如果你要在App里加入一个永不会和其它ID冲突的用户ID,你可以自己建一个服务器,并用脚本为每个客户端分配一个ID。但这种集中管理的方式受网络影响,速度慢,而且服务器处理时间也影响速度。事实上你可以用UUID,它在每个客户端上生成ID,生成的ID不会跟任何ID重复(UUID生成条件: 1.当前日期和时间 2.时钟序列 3.全局唯一的IEEE机器识别号,如果有网卡从网卡MAC地址获得,没有网卡以其他方式获得)。
7.点(pt) && 像素(px)
iOS 开发中用到的单位 pt 是独立像素的意思,它是绝对长度,不随屏幕像素密度变化而变化(和我们日常用到的毫米、厘米是一个意思,只是它要小得多),在非视网膜的 iPhone 上(iPhone 3G),苹果规定 1px=1pt,也就是说 pt 和像素点是一一对应的。但随着 iPhone 4 的到来,高分屏出现了(视网膜屏),这个时候 1pt 对应 2px
8.int && NSInteger
#if LP64 || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64typedef long NSInteger;typedef unsigned long NSUInteger; #elsetypedef int NSInteger;typedef unsigned int NSUInteger; #endif
NSInteger与int的区别是NSInteger会根据系统的位数(32or64)自动选择int的最大数值(int or long)。
9.iOS多重继承 协议 && 分类 && 消息转发
iOS多继承的实现及区别
10.Object-C 优点 && 缺点
优点:1.分类 在不创建继承类的情况下,给已经存在的类添加方法
2.运行时 运行时主要包括动态识别,动态添加属性,动态添加方法,动态交换方法实现
3.可以和C、C++混编
缺点:1.没有多重继承
2.没有命名空间
3.不支持运算符重载
11.Object-C 动态特性 && 动态特征
动态特征:1.封装 封装是隐藏对象的属性和方法实现,仅对外公开接口
2.继承 使子类具有父类的各种属性和方法
3.多态 允许将子类类型的指针赋值给父类类型的指针,即父类的指针指向子类的实例
动态特性:1.动态类型 (id类型)在编译器编译的时候不能被识别出,在运行时(run time),程序运行的时候才会根据 语境来识别。
2.动态绑定 (关键词@selector)跳过编译,在运行时动态添加函数调用,运行时才决定调用什么方法,传递 什么参数。
3.动态加载 根据需求动态地加载资源。
12.讲一下MVC && MVVM && MVP
MVC特点:
MVC模式的特点是数据模型与业务和展示逻辑解耦。在客户端web开发中,就是将模型(M-数据、操作数据)、视图(V-显示数据的HTML元素)之间实现代码分离,松散耦合,使之成为一个更容易开发、维护和测试的客户端应用程序。
View 传送指令到 Controller ;
Controller 完成业务逻辑后,要求 Model 改变状态 ;
Model 将新的数据发送到 View,用户得到反馈。
MVP(Model-View-Presenter)是MVC的改良模式,由IBM的子公司Taligent提出。和MVC的相同之处在于:Controller/Presenter负责业务逻辑,Model管理数据,View负责显示只不过是将 Controller 改名为 Presenter,同时改变了通信方向。
MVP特点:M、V、P之间双向通信。
View 与 Model 不通信,都通过 Presenter 传递。Presenter完全把Model和View进行了分离,主要的程序逻辑在 Presenter里实现。
View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,这样就可以重用。不仅如此,还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试–从而不需要使用自动化的测试工具。
MVVM
MVVM是Model-View-ViewModel的简写。MVVM模式其实是MV模式与WPF结合的应用方式时发展演变过来的一种新型架构模式。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。
13.load && initialize
调用方式:load是根据函数地址直接调用,initialize是通过objc_msgSend调用
调用时刻:load是runtime加载类、分类的时候调用(只会调用1次),initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)调用顺序:先调用类的load方法,先编译那个类,就先调用load。在调用load之前会先调用父类的load方法。分类中load方法不会覆盖本类的load方法,先编译的分类优先调用load方法。initialize先初始化父类,之后再初始化子类。如果子类没有实现+initialize,会调用父类的+initialize(所以父类的+initialize可能会被调用多次),如果分类实现了+initialize,就覆盖类本身的+initialize调用。
14.CocoaPods && Carthage
CocoaPods 好处?
- 开发
iOS
项目不可避免地要使用第三方开源库,CocoaPods
的出现使得我们可以节省设置和更新第三方开源库的时间- 在引入第三方库时它可以自动为我们完成各种各样的配置,包括配置编译阶段、连接器选项、甚至是
ARC
环境下的-fno-objc-arc
配置等Carthage 好处?
- 通过Carthage可以将一部分不常变的库打包成framework,再引如到主工程,这样可以减少开发过程中的编译时间。
- 可以将一些编译时间很长的库打包成framework。
- 国内防火墙的缘故,有些库的下载慢到一定境界,这个时候,使用Carthage就是福音了。
- 同时可以优化CI的编译、打包时间。
三、Carthage 和 CocoaPods 的不同之处:
CocoaPods
(默认)自动建立和更新一个Xcode workspace
,用来管理你的项目和所有依赖。Carthage
使用xcodebuild
来编译出二进制库,剩下的集成工作完全交给开发人员。
CocoaPods
使用起来方便,Carthage
更加灵活并且对现有项目没有太多的侵略性。
CocoaPods
希望建立一个生态系统,可以更加方便的发现和集成第三方代码库。Carthage
希望变成一个去中心化的依赖管理系统,不提供中心化的项目列表,减少维护成本和单点失败的概率。不过这样给开发人员寻找项目带来不便。
CocoaPods
的项目需要配置podspec
文件,包含了项目和第三方库的信息。Carthage
并不使用类似的配置文件,第三方库的依赖关系是通过Xcode
项目来配置的。CocoaPods是已存在很长时间的Cocoa依赖管理器, 那么为什么要创建Carthage呢?
1) CoaoaPods 是一套整体解决方案,我们在 Podfile 中指定好我们需要的第三方库。然后 CocoaPods 就会进行下载,集成,然后修改或者创建我们项目的 workspace 文件,这一系列整体操作。
2) 相比之下,Carthage 就要轻量很多,它也会一个叫做 Cartfile 描述文件,但 Carthage 不会对我们的项目结构进行任何修改,更不多创建 workspace。它只是根据我们描述文件中配置的第三方库,将他们下载到本地,然后用 xcodebuild 构建成 framework 文件。然后由我们自己将这些库集成到项目中。Carthage 使用的是一种非侵入性的哲学。CocoaPods 有如下优势:
① 使用方便, 除编写 Podfile 以外其他几乎都是自动完成;
② 软件包数量多,主流支持;
③ 支持 iOS 8 Framework,当然也支持旧的静态编译.但是 CocoaPods 作为一个有中心仓库的解决方案,缺点也比较明显:
1 每次更新环境都需要连接到中心仓库,比较耗时;
2 开发者使用比较简单,但是如果创建兼容 CocoaPods 的库,就会相对繁琐一些(尽管有了命令行);
3 每次干净编译都会把所有第三方库都重新编译一次Carthage 的优势:
① 使用 Carthage 的话,所有的第三方库依赖,除非是更新的需要,不然平常
干净编译 Project,它是不需要再次编译
的,大大加快平常编译及 Archive 的时间.
② 它是去中心化
的,没有中心服务器. 这意味着每次配置和更新环境,只会去更新具体的库,而不会有一个向中心服务器获取最新库的索引这么个过程,如此又省了很多时间.
③ CocoaPods 无缝集成!一个项目可同时使用两套包管理工具
, 当前 CocoaPods 管理主要 Framework 的配置下, 将少量其他 Framework 交给了 Carthage 管理, 二者可以和谐地共存.
④ 结构标准的项目天然就是 Carthage 库
.Carthage 的不足:
1库依然不如 CocoaPods 丰富:尽管很多库不需要声明并改造就直接可以被 Carthage 用,但依然有大量 CocoaPods 能用的库不支持,我相信时间能解决这个问题;
2只支持 Framework,所以是 iOS 8 Only
了,随着时间推移,这个也不会是问题;
3工具仍不完善:在使用过程中,发现它无法在一个结构复杂的项目中正确发现库(比如有 iOS, Mac demo + framework 的结构);
4无法在 Xcode 里定位到源码:如果你在写代码过程中,想跳转到一个第三方库去看具体的实现,这是无法办到的,Carthage 的配置只能让你看到一个库的头文件
14.动态库 & 静态库
一、静态库和动态库的区别
库:是资源文件和代码编译的一个集合
静态库: 静态库是在编译时,完整的拷贝至可执行文件中,被多次使用就有多次冗余拷贝;
动态库: 程序运行时由系统动态加载到内存,而不是复制,供程序调用。系统只加载一次,多个程序共用,节省内存。因此,编译内容更小,而且因为动态库是需要时才被引用,所以更快。
静态和动态的名字,区分了编译后的代码是以何种方式链接到目标程序中的。
二、静态库和动态库的形式
静态库:
.a
和.framework
动态库:
.dylib
和.framework
framework为什么可能是动态库,也可能是静态库?系统的
.framework
是动态库, 我们自己建立的.framework
是静态库。Bundle的概念,framework是一种特殊类型的Bundle,bunlde是一个包含多个子文件夹的文件夹。在iOS上,Bundlue将相关联的文件(比如图片, Nibs,代码)编译成一个包文件。程序将它当作一个单独文件来处理,你可以在不知道内部实现的情况下使用它。
而库需要一些其他资源:头文件,本地化文件,图片资源,文档和示例。我们可以将其打包成一个bunlde,这就是framework。
静态库包含静态资源包,动态库包含动态资源包,而且动态库可能包含同一个动态资源包的不同版本。
资料梳理-- XX YY相关推荐
- JSP中 request.getRealPath(/xx/yy) 方法提示已经过时的替代方法
我们的JSP项目在上传文件时通常都需要获取目录在服务器上的绝对路径,request.getRealPath()方法显示已经过时,但是还是有替代方法的. HttpSession session = re ...
- 生成式模型 生成对抗网络——资料梳理(专访资料 + 论文分类)
转载自:http://blog.csdn.net/solomon1558/article/details/52338052 文献整理 题目 主要内容 ...
- java getrealpath_JSP中 request.getRealPath(/xx/yy) 方法提示已经过时的替代方法
我们的JSP项目在上传文件时通常都需要获取目录在服务器上的绝对路径,request.getRealPath()方法显示已经过时,但是还是有替代方法的.HttpSession session = req ...
- HP打印机常见故障维修资料
HP打印机常见故障维修资料 HP打印机维修资料大全:惠普打印机控制面板下表解释打印机控制面板上可能显示的信息.打印机信息及其含义按字母顺序列出,然后是编号信息.如果信息持续出现:如果要求给纸盘装纸的信 ...
- cmd关机计算机名称,CMD远程关机 -电脑资料
这里再介绍一下CMD命令之远程关机命令 在Windows XP/2003中,新增了一条命令行工具"shutdown",它可以关闭或重新启动本地或远程计算机, shutdown :x ...
- 全网最全梳理,Python 办公自动化这篇真的太棒了
大家好,今天给大家分享一篇 Python 自动化办公干货,内容很干,每一步都有详细的说明,是一篇非常全面的 Python 操作 Excel 文章,内容较长,建议大家收藏后学习,梳理不易,麻烦点赞支持. ...
- c语言是以文件为单位编译,c语言从头开始(三:编译器工作原理) (我们还可以自己编写头文件后缀是xx.h并把它当前代码文件所在目录我们要用就可以直接通过下面代码使用)...
c语言从头开始(三:编译器工作原理) [[枫歌枫歌]c语言从头开始(三:编译器工作原理)]https://toutiao.com/group/6568056688174170628/?iid=1590 ...
- 梳理各算法基础应用及场景
knn: import numpy as np from sklearn.neighbors import KNeighborsClassifier X = np.array([[1, ...
- YY/T 0664—2020《医疗器械软件 软件生存周期过程》 相关
标准书: YY/T 0664-2020 医疗器械软件 软件生存周期过程 - 道客巴巴 (doc88.com) 国家药监局关于发布34项医疗器械行业标准的公告(2020年第108号) 第10项为&qu ...
最新文章
- windows下安装ubuntu 12.04---利用ubuntu的iso包中的wubi.exe工具安装
- linux运行炉石传说,使用Lutris在Linux上玩炉石传说
- 洛谷P1119 灾后重建[Floyd]
- 开源的pop3和smtp组件(支持中文及SSL)
- 全世界的狗都没有“生殖隔离” | 今日趣图
- 【Bootstrap】 bootstrap-table表格组件
- [Topic]Advanced Run Time Type Identification in C++
- poj 1962 Corporative Network 并查集,很容易超时,大家要注意合并
- #pragma的常用方法讲解(转载)
- bat脚本 拷贝文件/文件夹到目标目录
- 10分钟学会如何通过问卷调查赚钱
- 低代码平台开发 python_低组词_低的多音字组词,低是多音字吗,低组词有哪些
- 联想服务器安装win10系统安装教程,联想win10企业版操作系统安装步骤详解
- 京东联盟导购平台开发指南(附带API接口)
- 墨天轮“高可用架构”干货文档分享(含Oracle、MySQL、PG资料124篇)
- Android Camera HAL3 - 开篇词
- 数据中台:民生银行的数据中台实践方案
- thinkPHP基于php的枣院二手图书交易系统-计算机毕业设计
- 韩国多佑集团软件和服务外包基地纳米大厦大连揭幕
- 树形结构的处理——组合模式(五)