设计模式-软件设计的7个原则

设计模式-软件设计的7个原则

概述

在软件开发时为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,通常要遵守一定的设计原则:

  1. 开闭原则
  2. 里式替换原则
  3. 依赖倒置原则
  4. 单一职责原则
  5. 接口隔离原则
  6. 迪米特原则
  7. 合成复用原则
阅读全文 »

Git-合并两个不同的仓库

Git-合并两个不同的仓库

有时候我们需要合并两个不同地址的Git仓库,比如:其中一个仓库A我们在GitHub上部署,另外一个仓库B我们在国内的Coding上部署,两者为同一个工程,如果我们希望将仓库A的所有改动合并到仓库B上。

整个操作的思路是伪造伪造其中一个远程仓库作为另一个仓库的一个分支,然后进行分支合并。

阅读全文 »

MySQL - 基础语法

MySQL - 基础语法

SQL

Structured Query Language:结构化查询语言
定义了了操作所有关系型数据库的规则

SQL 通用语法

  1. SQL 语句可以单行或多行书写,以分号结尾
  2. 可使用空格和缩进来增强语句的可读性
  3. MySQL 数据库的SQL语句不区分大小写,关键字建议大写
  4. 注释:
    1. 单行注释:-- 注释内容 或 # 注释内容 (MySQL独有)
    2. 多行注释:/* 注释内容 */
阅读全文 »

iOS - Runtime 详解

iOS - Runtime 详解

0. 概述

Objective-C Runtime 使得C具有了面向对象的能力,在程序运行时创建,检查,修改类,对象和它们的方法。Runtime 是 C和汇编写的,这里http://www.opensource.apple.com/source/objc4/可以下载Apple维护的开源代码,GUN也有一个开源的Runtime版本,它们都努力保持一致。Apple官方的runtime编程指南

对于 C 语言,函数的调用会在编译期就已经决定好,在编译完成后直接顺序执行。但是 OC 是一门动态语言,函数调用变成了消息发送,在编译期不能知道调用哪个函数,Runtime 就是去解决如何在运行时期找到调用方法的问题。

阅读全文 »

iOS - 系统中的锁

多线程同时访问同一块资源会造成资源抢夺,容易引发数据错乱和数据安全问题,此时我们需要保证资源同时只有一个线程访问,加锁就是为了解决这个问题。

常用的加锁方式:(性能由差到好)

  • OSSpinLock 自旋锁,存在优先级反转问题,破坏了 spinLock,后来Apple推出 os_unfair_lock_t 解决优先级翻转问题
  • dispatch_semaphore 信号量
  • pthread_mutex 互斥锁 (C语言)
  • NSLock 对象锁
  • NSCondition 条件锁
  • NSRecursiveLock 递归锁
  • NSConditionLock 条件锁
  • @synchronized 性能最差
阅读全文 »

Java - 基础语法二

Java - 基础语法二

① 常用 API

Object 类

java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。

常用 API:
public String toString(): 返回该对象的字符串表示
public boolean equals(Object obj) : 与其他对象比较是否与当前对象“相等”

阅读全文 »

Java - 基础语法一

Java - 基础语法一

① 基础语法

  • JVM(Java Virtual Machine): Java 虚拟机,简称 JVM,是运行所有 Java 程序的假想计算机,是 Java 程序的运行环境,是 Java 最具吸引力的特性之一。我们编写的 Java 程序,都运行在 JVM 之上。
  • JRE(Java Runtime Environment):Java 程序的运行环境,包含 JVM 和运行时所需要的核心类库。
  • JDK(Java Development Environment):Java 程序开发工具包,包含 JRE 和开发人员使用的工具。
阅读全文 »

iOS - 类与对象

iOS - 类与对象

类方法

OC 中类的方法只有实例方法和静态方法两种:

@interface Controller: NSObject
/// 静态方法
+ (void)thisIsAStaticMethod;

/// 实例方法
- (void)thisIsAnInstanceMethod;
@end

OC 中的方法只要声明在 @interface 里,就可以认为是公有的。实际上,OC 没有像 Java,C++ 中的那种绝对的 私有及保护 的成员方法,仅仅可以对调用者隐藏某些方法。

声明和实现都写在 @implementation 里的方法,类的外部是看不到的。

可以使用 分类(Category) 和 类扩展(Extension)来实现私有方法。

阅读全文 »

内存管理、磁盘和文件拾遗

内存管理、磁盘和文件拾遗

Part1. 内存管理

一个程序的可执行文件在内存中的结果,从大的角度可以分为两个部分:只读部分和可读写部分。只读部分包括程序代码(.text)和程序中的常量(.rodata)。
可读写部分(变量)大致可分为下面几个部分:

  • .data:初始化了的全局变量和静态变量
  • .bss:即 Block Started by Symbol,未初始化的全局变量和静态变量
  • heap:堆,使用 mallocreallocfree函数控制的变量,堆在所有的线程,共享库,和动态加载的模块中被共享使用。
  • stack:栈,函数调用时使用栈来保存函数现场,自动变量(即生命周期限制在某个 scope 的变量)也存放在栈中。
阅读全文 »

并发技术、进程、线程和锁拾遗

并发技术、进程、线程和锁拾遗

Part1. 多任务

计算机发展起初,CPU 资源十分昂贵,如果让 CPU 只能运行一个程序那么当 CPU 空闲下来(例如等待 I/O 时),CPU 资源就会被浪费,为了使 CPU 资源得到更好的利用,先驱编写了一个监控程序,如果发现某个程序暂时无需使用 CPU 时,监控程序就把另外的正在等待 CPU 资源的程序启动起来,以充分利用 CPU资源。这种方法称为 - 多道程序(Multiprogramming)

对于多道程序,最大的弊端是各程序之间不区分轻重缓急,对于用户交互式的程序来说,对 CPU 计算时间的需求并不多,但是对于响应速度却有比较高的要求。而对于计算类程序来说则相反,对响应速度要求低,但需要长时间的 CPU 计算。想象一个场景:我在同时在浏览网页和听音乐,我们希望浏览器能够快速响应,同时也希望音乐不停,这时候多道程序就没法达到我们的要求了。

阅读全文 »