0%

直接快照记录,而非差异比较

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

阅读全文 »

svn版本控制是集中式的数据管理,存在一个中央版本库,所有开发人员本地开发使用的代码都是来自这个版本库,在中央版本库中建立多个项目。

svn工作流程:

  1. 在中央版本库中创建一个项目,项目中包含主干和分支,分支是从主干复制的;
  2. 开发人员从中央版本库check out 下这个分支的代码;
  3. 增加自己的代码、修改或删除现存的代码;
  4. commit 代码,如果修改期间其他人提交了代码,就会提示过期无法提交,就需要先up,之后再提交;如果up代码时出现冲突,就需要解决冲突之后在提交(开发人员协商解决冲突);
  5. 测试环境测试,解决问题之后合并到主干中,在之后更新生产环境代码。

缺点:

  1. 严重依赖网络环境,连接不到中央版本库时无法工作;
  2. 需要备份——需要备份数据和修改的历史记录。

static 的两大作用

  1. 控制存储方式

    static被引入以告知编译器,将变量存储在程式的静态存储区而非栈上空间。

    • 引出原因:函数内部定义的变量,在程式执行到他的定义处时,编译器为他在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,怎么实现?

      最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。

    • 解决方案:因此c++ 中引入了static,用他来修饰变量,他能够指示编译器将此变量在程式的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。

      阅读全文 »

  1. 查看当前镜像源:gem source -l
  2. 若镜像地址无效,删除gem源:gem sources –remove https://ruby.taobao.org/
  3. 添加有效的镜像地址:gem source —a https://gems.ruby-china.com/
  4. 查看gem源是否是最新的:gem sources -l
  5. 更新gem:sudo gem update –system
  6. 升级cocoapods:sudo gem install -n /usr/local/bin cocoapods —pre 或 sudo gem install cocoapods
  7. 查看升级后的cocoapods版本:pod –version

在iOS应用中,用户上传的图片通常需要进行压缩后才能进行上传。

图片的压缩其实是两个不同的概念:

  1. 是 “压” 文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。
  2. 是 “缩” 文件的尺寸变小,也就是像素数减少。长宽尺寸变小,文件体积同样会减小。
    阅读全文 »

as

Guaranteed conversation + Upcasting

有保证的转换,从派生类转换为基类的向上转型。

1
2
3
4
5
6
7
let num = 1 as CGFloat	//将1转成float

//dog转成父类animal
class Animal{}
calss Dog: Animal{}
let d = Dog()
d as Animal

as!

Forced conversation + Downcasting

阅读全文 »

KVC,即是指 Key Value Coding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。KVC是实现KVO的基础。

一个对象拥有某些属性。比如一个Person对象有一个name和一个address属性。则Person对象分别有一个value对应他的nameaddress的key。 key只是一个字符串,它对应的值可以是任意类型的对象。从最基础的层次上看,KVC 有两个方法:一个是设置key的值,另一个是获取key的值。如下面的例子:

1
2
3
4
5
6
7
8
9
-(void)changePerson:(Person *)p name:(NSString *)newName
{
// using the KVC accessor (getter) method
NSString *originalName = [p valueForKey:@"name"];
// using the KVC accessor (setter) method.
[p setValue:newName forKey:@"name"];
NSLog(@"Changed %@'s name to: %@", originalName, newName);

}
阅读全文 »

当观察某对象A时,KVO机制动态创建一个对象A当前类的子类,并为这个新的子类重写被观察属性keyPath的setter方法。setter方法负责通知观察对象该属性的改变状况。

Apple 使用了isa混写(isa-swizzling)来实现 KVO 。当观察对象A时,KVO机制动态创建一个新的名为: NSKVONotifying_A的新类,该类继承自对象A的本类,且KVO为NSKVONotifying_A重写被观察属性的setter方法,setter方法会负责在调用原setter方法之前和之后,通知所有观察对象该属性值的更改情况。

  1. NSKVONotifying_A类

    在KVO过程中,被观察对象的isa指针从指向原来的A类,被KVO机制修改为指向系统新创建的子类——NSKVONotifying_A类,来实现当前类属性值改变的监听

    阅读全文 »

集合类Crash

数组越界

从数组中取某个index的元素时,先对index和数组元素个数进行判断:

1
2
3
if(index < self.array.count){
id obj = self.array[index];
}

注意:在使用数组时,要特别注意对边界条件的判断

向数组中插入空对象

向数组中插入数据时,先判断是否为nil

阅读全文 »