frizzlefur / dailylearning Goto Github PK
View Code? Open in Web Editor NEWMy Daily Learning~
License: MIT License
My Daily Learning~
License: MIT License
这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系; 能看懂类图中各个类之间的线条、箭头代表什么意思后,也就足够应对 日常的工作和交流; 同时,我们应该能将类图所表达的含义和最终的代码对应起来; 有了这些知识,看后面章节的设计模式结构图就没有什么问题了;
本章所有图形使用Enterprise Architect 9.2来画,所有示例详见根目录下的design_patterns.EAP
请看以下这个类图,类之间的关系是我们需要关注的:
下面我们将介绍这六种关系;
类的继承结构表现在UML中为:泛化(generalize)与实现(realize):
继承关系为 is-a的关系;两个对象之间如果可以用 is-a 来表示,就是继承关系:(..是..)
eg:自行车是车、猫是动物
泛化关系用一条带空心箭头的直接表示;如下图表示(A继承自B);
eg:汽车在现实中有实现,可用汽车定义具体的对象;汽车与SUV之间为泛化关系;
注:最终代码中,泛化关系表现为继承非抽象类;
实现关系用一条带空心箭头的虚线表示;
eg:”车”为一个抽象概念,在现实中并无法直接用来定义对象;只有指明具体的子类(汽车还是自行车),才 可以用来定义对象(”车”这个类在C++中用抽象类表示,在JAVA中有接口这个概念,更容易理解)
注:最终代码中,实现关系表现为继承抽象类;
聚合关系用一条带空心菱形箭头的直线表示,如下图表示A聚合到B上,或者说B由A组成;
聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如一个部门由多个员工组成;
与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在;例如, 部门撤销了,人员不会消失,他们依然存在;
组合关系用一条带实心菱形箭头直线表示,如下图表示A组成B,或者B由A组成;
与聚合关系一样,组合关系同样表示整体由部分构成的语义;比如公司由多个部门组成;
但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了;例如, 公司不存在了,部门也将不存在了;
关联关系是用一条直线表示的;它描述不同类的对象之间的结构关系;它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;
比如,乘车人和车票之间就是一种关联关系;学生和学校就是一种关联关系;
关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示A知道B,但 B不知道A;
注:在最终代码中,关联对象通常是以成员变量的形式实现的;
依赖关系是用一套带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系;
与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;
显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生;
注:在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;
2019-04-06
完成了:....
😃100
如果你已经厌烦了一直使用delegate模式来编程的话,偶尔转转写一些block,不仅可以锻炼思维,也能让你写的代码看起来高端洋气一些,而且因为代码跳转变少,所以可读性也会增加。
iOS 组件化开发项目框架设计,结合 MVVM 设计模式 + RAC 数据绑定 + Pod 组件管理, 实现一套实战性的iOS组件化框架
wangshiyu13/Lothar: 基于CTMediator的组件化中间件
iOS 组件化方案探索 | WeRead团队博客
iOS组件化实践(一):简介 - 简书
iOS组件化实践(三):实施 - 简书
这个项目涉及到的点比较多,我会慢慢分部整理
Runtime
运行时的机制对于C语言,函数的调用在编译的时候会决定调用哪个函数。 在编译阶段,C语言调用未实现的函数就会报错。
对于Objective-C
的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。在编译阶段,Objective-C
可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错。
Objective-C
语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。
这种特性意味着Objective-C
不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。对于Objective-C
来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行。这个运行时系统即Objc Runtime
。Objc Runtime
其实是一个Runtime
库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。
Runtime
运行时的作用Runtime
归档/反归档Runtime
运行时的优点Multiple Inheritance
Method Swizzling
Aspect Oriented Programming
(在运行时,动态地将代码切入到类的指定方法、指定位置上的编程**就是面向切面的编程。)Isa Swizzling
Associated Object
关联对象NSCoding
的自动归档和自动解档Runtime
项目实战Demo
的展示
Jenkins是个比较方便持续集成的工具,简单记录一下利用Jenkin拉取SVN的iOS代码,并且打包上传到蒲公英(fir.im类似)的过程。安卓只需要安装对应的插件就可以。可以实现定时打包发布任务,方便自动化管理。考虑到现在代码基本往Git上迁移,在第八步给出快捷迁移SVN代码到Git的方法。
Ccache 是一个编译缓存器,它会在实际编译之前先检查缓存。它有直接和预处理模式,而且由于在 Clang 3.2 版本之前是不支持 ccache 插件,所以在 Clang 3.2 之前会有一些问题,但是现在 Clang 的版本是 3.2.3,所以没有 Clang 不支持的问题。ccache 是一个具有悠久历史的项目,其主要焦点是快速正确。
逆向App,进行分析
占坑~
参考解答: self.name ="object":会调用对象的setName()方法; name =“object":会直接把object赋值给当前对象的name属性。
NSString*obj = [[NSData alloc] init];
obj在编译时和运行时分别时什么类型的对象?参考解答: 编译时是NSString的类型, 运行时是NSData类型的对象
Runloop
的面试题:main()
函数启动后,在主线程开启UIApplicationMain
的Runloop
后,在下面的main()
函数里创建了一个autoreleasepool
,请问如果程序不退出,main()
函数永远不会返回,那么程序中(比如一个VC中)创建的对象是否就永远不会被释放?int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
参考解答: 在程序创建的对象,不是被main()
函数中的autoreleasepool
管理的,
而是由主线程的Runloop
管理,在某次Runloop
循环中,Runloop
休眠之前调用了对象的release
方法释放。
在每次Runloop
循环中,Runloop
休眠之前会调用了对象的release
方法释放AutoreleasePoolPage
中边界内的对象。
参考解答: 两个问题: 1、添加,删除,修改数组内的元素的时候程序会因为找不到对应的方法而崩溃.因为copy就是复制一个不可变NSArray的对象,使用了atomic属性会严重影响性能。
参考解答: 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境): strong与copy。那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?
由于NSMutableString是NSString的子类,所以一个NSString指针 可以指向NSMutableString对象,让我们的strongString指针指向一 个可变字符串是OK的。
而上面的例子可以看出,当源字符串是NSString时,由于字符串是不可变的,所以,不管是strong还是copy属性的对象,都是指向源对象,copy操作只是做了次浅拷贝。当源字符串是NSMutableString时,strong属 性只是增加了源字符串的引用计数,而copy属性则是对源字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。
这里还有一个性能问题,即在源字符串是NSMutableString, strong是单纯的增加对象的用计数,而copy操作是执行了一次深拷贝,所以性能上会有所差异。而如果源字符串是NSString时,则没有这个问题。
所以,在声明NSString属性时,到底是选择strong还是copy,可以根据实际情况来定。不过,一般我们将对象声明为NSString时,都不希望它改变,所以大多数情况下,我们建议用copy,以免因可变字符串的修改导致的一些非预期问题。
2.3 __strong的使用场景?
参考解答: AutoLayout
,是苹果公司提供的一个基于约束布局,动态计算视图大小和位置的库,并且已经集成到了Xcode开发环境里。
AutoLayout的实现原理
AutoLayout性能
AutoLayout关于更新的几个方法的区别
tableView:cellForRowAtIndexPath:
和tableView:heightForRowAtIndexPath:
.tableView:cellForRowAtIndexPath:
方法。只是有一点,尽量不要在此时绑定数据,因为目前在屏幕上还没有cell,可以在UITableView的delegate方法tableView:willDisplayCell:forRowAtIndexPath:
中进行数据的填充。需要说明的是,你可能会动态计算cel高度,但最好是不要选择Autolayout。使用Autolayout后,会根据cel的子视图使得求解的约束也越多,从而降低计算速度,影响滑动时FPS。所以,为了使tableview平滑滚动,请使用动态计算高度,不要选择Autolayout。shouldRasterize
要设成YES。drawAtPoint
drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont*)font
cellForRow
方法里面设置cell的图片数据源,也就是说如果一个cell的imageview对象开启了一个下载任务,这个时候该cell对象发生了重用,新的image数据源会开启。imageview
对象,就会发生2个下载任务回调给同一个imageview对象。这个时候就有必要做一些处理,避免回调发生时,错误的image数据源刷新了UI。tableview
的时候我们需要手动去取消掉下载操作,当用户停止滑动,再去执行下载操作网络Http请求 · Issue #9 · FrizzleFur/DailyLearning
学习Flutter还是为了在项目中利用Flutter的优势,提升开发效率和性能。
先分flutter的介绍,语法重点,底层原理,和项目实战,和注意坑点。
主要通过项目学习SwiftUI
SwiftUI的原理&**
Combine框架的使用
issue
的回复也很有范:JavaScript
的好资源iOS
只有一年时间,对比自己,倍感惭愧。学习需要提高效率和专注,戒骄戒躁。沉下❤️来才能快速前行。Review
, 清除垃圾,提高效率。ipader/SwiftGuide: Swift Featured Projects in brain Mapping
Swift 3关于函数类型的一项重要提议 - 泊学 - 一个全栈工程师的自学网站
基于Alamofire的HTTP通信 - 泊学 - 一个全栈工程师的自学网站
Master MVVM in Swift - 泊学 - 一个全栈工程师的自学网站
一次好的面试是一次难得的交流机会。
2020年10月
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.