RICHIE


  • 首页

  • 归档

  • 分类

  • 标签

算法集

发表于 2018-12-28 | 分类于 原创

字符串

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。
阅读全文 »

React Native 实现原理

发表于 2018-09-29 | 分类于 原创

RCTRootView 创建前到中

获取URL

从localhost/ip获取,或者从本地获取

阅读全文 »

GCD 队列探索

发表于 2018-09-12 | 分类于 原创

dispatch_object_t

所有GCD结构体的联合体,可以表示任意GCD对象

阅读全文 »

iOS 架构

发表于 2018-08-28 | 分类于 原创

MVC

Model持有数据,View显示与用户交互的界面,而Controller被定义成最小的可重用单元,负责协调Model与View之间的交互。

但在实际项目中,却因业务的复杂使其变得臃肿,因为它们经常被混杂到View的生命周期中,因此很难说View和ViewController是分离的。

阅读全文 »

斐波那契数列及优化和计算字符串中最长非重复子串长度

发表于 2018-08-08 | 分类于 原创

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

分析:

青蛙每次只会跳1级或2级,则跳n级必定是所有的1级和2级之和
设f(0)=1
跳上1级只有1种跳法(0->1) => f(1)=1
跳上2级有2种跳法(0->1->2,0->2)=> f(2)=f(1)+f(0) => f(2)=2
跳上3级有3种跳法(0->1->2->3,0->1->3,0->2->3)=> f(3)=f(2)+f(1)
跳上4级有5种跳法(0->1->2->3->4,0->1->2->4,0->1->3->4,0->2->3->4,0->2->4)=> f(4)=f(3)+f(2)
...
跳上n级有:f(n)=f(n-1)+f(n-2)
结果是斐波那契数列

斐波那契数列及优化(不考虑大数)

  • 常见递归实现
1
2
3
4
5
6
int fibon(int n) {
if (n <= 2) {
return 1;
}
return fibon(n-1) + fibon(n-2);
}
阅读全文 »

Sort Algorithms 整理

发表于 2018-07-28 | 分类于 原创

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void BubbleSort(int a[], int n) {
bool flag = false; //标记是否发生交换,若没有表示已经有序
for (int i = 0; i < n-1; ++i) { //要进行n-1次冒泡
for (int j = n-1; j > i; j--) {
/*
从最后一个元素开始,较小的在前
*/
if (a[j] < a[j-1]) {
int tmp = a[j-1];
a[j-1] = a[j];
a[j] = tmp;
flag = true;
}
}
if (flag == 0) {
return;
}
}
}
阅读全文 »

iOS Block 探索

发表于 2018-07-23 | 分类于 原创

Block:带有自动变量的匿名函数。

匿名函数:没有函数名的函数,一对{}包裹的内容是匿名函数的作用域。

自动变量:栈上声明的一个变量不是静态变量和全局变量,是不可以在这个栈内声明的匿名函数中使用的,但在Block中却可以。

阅读全文 »

NSObject Lifecycle 探索

发表于 2018-07-10 | 分类于 原创

NSObject

声明

1
2
3
4
5
6
@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
Class isa OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}
阅读全文 »

iOS Runloop 探索

发表于 2018-06-19 | 分类于 原创

RunLoop

实际上是一个对象,这个对象管理了其需要处理的事件和消息.

macOS/iOS系统中,提供了两个这样的对象:NSRunLoop 和 CFRunLoopRef。

CFRunLoopRef 是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,所有这些 API 都是线程安全的(CFSpinlock/CFSpinUnlock)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct __CFRunLoop {
CFRuntimeBase _base;
pthread_mutex_t _lock; /* locked for accessing mode list */
__CFPort _wakeUpPort; // used for CFRunLoopWakeUp
Boolean _unused;
volatile _per_run_data *_perRunData; // reset for runs of the run loop
pthread_t _pthread;
uint32_t _winthread;
CFMutableSetRef _commonModes;
CFMutableSetRef _commonModeItems;
CFRunLoopModeRef _currentMode;
CFMutableSetRef _modes;
struct _block_item *_blocks_head;
struct _block_item *_blocks_tail;
CFTypeRef _counterpart;
};

typedef struct __CFRunLoop * CFRunLoopRef;

NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。

CFRunLoopRef 的代码是开源的,你可以在这里 下载到整个 CoreFoundation 的源码来查看。

阅读全文 »

Objective-C Runtime 探索

发表于 2018-06-01 | 分类于 原创

引言

初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话的深刻含义。其实[receiver message]会被编译器转化为:

1
objc_msgSend(receiver, selector)

如果消息含有参数,则为:

1
objc_msgSend(receiver, selector, arg1, arg2, ...)

如果消息的接收者能够找到对应的selector,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。
现在可以看出[receiver message]真的不是一个简简单单的方法调用。因为这只是在编译阶段确定了要向接收者发送message这条消息,而receive将要如何响应这条消息,那就要看运行时发生的情况来决定了。

Objective-C 的 Runtime 铸就了它动态语言的特性,这些深层次的知识虽然平时写代码用的少一些,但是却是每个 Objective-C程序员需要了解的。

阅读全文 »
123
Richie Zhang

Richie Zhang

23 日志
2 分类
5 标签
E-Mail
© 2018 — 2019 Richie Zhang