Effective Objective-C - 块与大中枢派发
前言Effective Objective C 读书笔记 - 块与大中枢派发
多线程的两大核心:block,GCD
笔记理解“块”这以概念
block其实也是一个数据类型,块也是对象类型
123void (^someBlock)() = ^{ // do something here}
块的强大之处在于:在声明块的范围里面,所有的变量都可以为其所捕获,在快内可以使用这些变量
在Block之前,只能使用函数指针或者是selector
每个OC对象都占有一个内存区域,块也是对象,下图就是块的内存区域:
invoke 是函数指针,指向块的实现代码
descriptor 是一个结构体指针,每个block都有这么一个变量,该结构体包含了块的详细信息:大小等等
块还会把 捕获到的变量 拷贝一份,注意这里拷贝的是指针
定义块的时候,块所占的内存是分配在栈中的,来看看下面的例子
1234567891011void (^block)(); // 声明一个block,是一个指针if (/* some condition */) { block = ^ ...
Auto Layout 与 CAKeyframeAnimation
前言最近实现了一个基于Auto Layout的CAKeyframeAnimation。先来看一下效果👇
问题分析看了效果图,第一反应应该是使用 CAKeyframeAnimation,让两个圆型view的position随着图中的贝塞尔曲线(CGPath)运动。
那么问题来了:整个视图是使用 Auto Layout 来实现的,并没有指定每个视图的frame,我们是否可以使用CAKeyframeAnimation呢?这就引出了下面要讲的几点👇
Auto Layout的本质
普通的基于Auto Layout 的动画
在Auto Layout视图中获取frame
CATransaction 与 CAKeyframeAnimation
Auto Layout 百分比布局
Auto Layout 的本质关于iOS Drawing 这篇文章里面讲述了 iOS系统将View显示在屏幕上的6个详细步骤。这里说一下前面3个步骤:
Layout:将一个或者多个UIView(也就是UIView hierarchy)显示在屏幕上的第一步就是 计算每个layer的frame。无论代码使用Auto ...
Effective Objective-C - 内存管理
前言Effective Objective C 读书笔记 - 内存管理
笔记理解引用计数
引用关系有一个引用树,在iOS中,这个根引用对象是UIApplication
调用alloc,引用计数加1,表示该对象想存活下去
即使对象的引用计数为0,其占用的内存已经被dealloc了,但是注意:这个时候它的内存只是放回了“可用内存池”,里面的数据不会立即被覆盖
记住一点:在MRC中,将指针指向对象是不会增加reference count的,必须手动加1
看看下面的MRC代码:
1234567- (NSString *)stringValue { NSString *str = [[NSString alloc]] initWithFormat:@"vanney"; // 1 return str;}NSString *str = [self stringValue];[str retain]; // 2
上面的代码在注释1,和注释2处分别增加了一次reference count,但是讲道理这个时候只需要一个reference co ...
关于iOS Drawing
前言学了一段时间的OpenGL,这次又重新看了一遍 iOS Core Animation 这本书,查看了许多资料。对这个iOS的drawing稍有顿悟=。=
这篇文章里面,我会针对下面几个方面说说我自己的见解:
Core Animation,Core Graphic 和 OpenGL ES
Rendering以及Animation的步骤
iOS Drawing中的CPU,GPU
drawRect方法的弊端
影响GPU与CPU绘制的因素
Core Animation,Core Graphics 和 OpenGL ESCore Animation,Core Graphics 和 OpenGL ES 三者都是和iOS画图,呈现内容相关的iOS框架。总体来说,Core Animation和UIKit是一个层级的,而他们底层画图的框架就是Core Graphics 和 OpenGL ES。
Core Animation 是iOS用来控制内容的显示和动画的。它的主要功能就是管理CALayer。
UIView 大家都很熟悉。那么UIView底层负责显示内容和动画的就是 ...
Effective Objective-C - 协议与分类
前言Effective Objective-C 读书笔记 - 协议与分类
协议(protocol)与Java的接口(interface)类似,由于OC不支持多重继承。通过协议,可以实现类似多重继承的效果。若指定某个类实现了某个协议,那么就表示,该类实现了协议中规定了一些方法。
分类(category)是OC的重要的一个语言特性。利用分类机制,无须继承子类即可为当前类添加方法。这也是由于动态runtime系统,才得以实现。
笔记通过委托与数据源协议进行对象间通信
注意一点,声明delegate的时候,要声明成weak类型的。避免循环引用。
通常将:委托对象是否可以响应协议中的某个方法 这一信息缓存起来。之后就不需要一直查询该对象是否响应该方法了。缓存可以使用位段来实现。
123456789101112131415@interface Example() { struct { unsigned int didReceiveData : 1; unsigned int didFailWithError : 1; } _del ...
Effective Objective-C - 接口与API设计
前言Effective Objective-C 读书笔记 - 接口与API设计
笔记用前缀避免命名空间冲突
前缀字母至少3个,两字母的前缀被Apple保留
注意:实现文件中的纯C函数以及全局变量也最好要加前缀,因为他们也是全局可见的。纯C函数,默认是extern的。(PS 见参考1)
提供全能初始化方法
初始化方法以 init 开头。
如果一个类有多个初始化方法的话,最好要选定一个方法为全能初始化方法,让其他的初始化方法都来调用这个全能初始化方法。
在全能初始化方法中,才执行数据的存储等等操作;其他方法只是改变调用全能初始化方法的参数而已。这样简单地保证了所有的初始化方法都能正确执行。
全能初始化方法要链式调用:也就是说,子类的全能初始化方法要调用超类的全能初始化方法。
还有子类的全能初始化方法如果与超类的全能初始化方法不重名的话,要覆写该方法
12345678910111213141516171819202122// 超类全能初始化方法(矩形类)- (id)initWithWidth:(float)width andHeight:(float)height { ...
OpenGL ES 入门
前言最近在学习OpenGL ES,跟着教程做了一个Demo,在模拟器下的运行效果如下:
Demo代码在这里
OpenGL和OpenGL ESOpenGL ES是OpenGL的子集,它主要运行在手机上。推荐一个超棒的OpenGL入门教程:Learn OpenGL ;当然也有热心的国人将他翻译过来了,在 这里。通过这些教程的学习,我也算是入了OpenGL的门。
关于将OpenGL运用于iOS上面,也就是使用OpenGL ES,可以看看Apple的官方文档 OpenGL ES Programming Guide for iOS
Demo实现demo的实现可以分成2个部分:
运用OpenGL ES显示静态的场景
添加手势操作,让场景动起来
OpenGL ES 渲染关于在iOS上使用OpenGL ES渲染,可以借助iOS的GLKit框架。他大大简化了OpenGL ES的使用难度。而渲染的主要步骤分成以下几步:
使用GLKit初始化创建GLKViewController和GLKView,OpenGL ES渲染的结果将会显示在GLKView的layer上面。而将GLKViewControl ...
记一次aws-ec2杀毒经历
前言前几天aws的ec2服务器被攻击了,被莫名人士植入了一个minerd的恶意程序,下面简单记录一下对这个恶意程序的处理过程
问题发现我们使用一台aws的ec2服务器来托管网站,前几天登录网站界面的时候一直在loading界面,死活无法登录。当我想终端登录ec2的时候也是死活登不上去。当时就有种不翔的预感,要GG。稳下来后,查看aws的CloudWatch监控记录,发现近段时间的ec2的CPU利用率一直很稳定的保持在100%。。。原来CPU被用完了,难怪怎么都登不上去,网站也无法运作。
问题解决登录ec2先得想办法登录ec2,看看到底发生了什么。注意:登录不上ec2的时候,千万不能随意的重启或者停止ec2;因为这样的话,存储在上面的数据可能会丢失。
但是cpu占用率始终保持在100%,怎么也登不上ec2。只能使用大招了。使用一下步骤曲线救国:
登录aws控制台。对现在的这台ec2(记为ec2one)的系统盘,也就是根卷创建一份快照
根据刚创建的快照创建一个卷(也就是:磁盘),这样就复制了ec2one的系统盘
启用一台全新的ec2(记为ec2two),注意登录密钥和ec2one的相 ...
C和指针读书笔记
前言《C和指针》读书笔记,会按章节排序
笔记快速上手
函数参数若指定为 const ,表示函数不会修改这个参数。
字符串就是一串以 NUL 字节结尾的字符,NUL作为字符串终止符,不属于字符串。 NUL也就是 ‘\0’
字符串常量以双引号起止。比如 “Hello” ,在内存中占据6个字节,分别是:H e l l o 和 NUL
基本概念
代码的翻译阶段:
程序的各个源代码先被转换成目标代码,也就是 .o 文件。编译阶段
然后各个目标代码会被链接器捆绑到一起,并且链接器还会将所需的各种库链接到程序中;这些目标代码和各种库捆绑到一起,形成最终的可执行文件,也就是 .out 文件。寻找各种库,会在系统库和用户指定的函数库中寻找。链接阶段
编译阶段:先解析(parse);若有优化选项的话,还要进行优化(optimizer)
对于字符注意一下 三字母词 。这些都以??开头,比如说 ??)表示的是]。所以当你打出 ??): 的时候,在控制台的输出会是 ]:
'\100':这里的100是八进制,表示64。也就是ASCII码值为64的字符,也就是@
同4所讲,' ...
看YYKit的源码
前言YYKit 源码分析 之 YYCache
笔记YYCache 是一个线程安全的 key-value 的缓存框架。使用 YYMemoryCache 来将对象存放在小且快的内存中;使用 YYDiskCache 来将对象存放在较慢的磁盘上。
YYCache先来看看 YYCache 的工作流程。
创建Cache(init)使用下面代码可以创建一个叫做vanney的新的cache。
1YYCache *newCache = [YYCache alloc] initWithName:@"vanney"];
这句语句所做的事情如下:
物理层面
在APP的 Caches 目录下面新建一个 vanney 的子目录,这个目录用来存放所有属于vanney的cache
在vanney目录下面新建一个 manifest 的sqlite数据库,这个数据库用来记录属于vanney的所有cache的信息,数据库的每一行记录表示一个cache。每一行的信息包括:
key : cache的唯一标识。manifes的主键
filename : 如果cache的数据大于设置的值的话(默认是20 ...