CJZ's Blog

回忆昨天,珍惜今天,期待明天


  • Home

  • Tags

  • Categories

  • Archives

Keychain

Posted on 2016-01-17

Keychain 介绍

Keychain Services 是 OS X 和 iOS 都提供一种安全地存储敏感信息的工具,比如,存储用户ID,密码,和证书等。存储这些信息可以免除用户重复输入用户名和密码的过程。Keychain Services 的安全机制保证了存储这些敏感信息不会被窃取。简单说来,Keychain 就是一个安全容器。

Read more »

回首2015,计划2016

Posted on 2016-01-11 | In 生活杂说

2015年总结

每当回首过去,总发现时间过得很快。2015也不例外,2014年虽然有目标,但是自己并未记录下来,但是大概能记住去年的目标。

Read more »

ReactiveCocoa 笔记(一)

Posted on 2015-11-25

前言

ReactiveCocoa一直在各大名博上面推荐,今天我找个时间特意学习一下。

众所周知,ReactiveCocoa是一个函数响应式编程的框架。那我们在学习之前最好了解一下什么是响应式编程。

函数响应式编程(Functional Reactive Programming,简称FRP)。
采用别人的一个小例子:

a = 2
b = 2
c = a + b // c is 4
b = 3
// now what is the value of c?

如果是像我们日常的OOP,那c的结果应该是4。但是是FRP,c的值会随着b的变化而变化,也就是说当b=3时,c应该是5。
比较直观的例子就是Excel,当改变某一个单元格的内容时,该单元格相关的计算结果也会随之改变。

Read more »

iOS多线程之NSOperation

Posted on 2015-09-02

前言

GCD是一种很强大的多线程解决方案,但NSOperation同样也支持多样性的操作。

NSOperation有三种状态

isReady -> isExecution -> isFinish

  • isReady: 返回 YES 表示操作已经准备好被执行, 如果返回NO则说明还有其他没有先前的相关步骤没有完成。
  • isExecuting: 返回YES表示操作正在执行,反之则没在执行。
  • isFinished : 返回YES表示操作执行成功或者被取消了

NSOperationQueue只有当它管理的所有操作的isFinished属性全标为YES以后操作才停止出列,也就是队列停止运行,所以正确实现这个方法对于避免死锁很关键。

Read more »

iOS 多线程之GCD

Posted on 2015-09-02

前言

在学习Android编程的时候,我们经常会使用 runOnUiThread(),把UI相关的操作放到里面。而一些耗时的操作,则放到一个新的后台线程,但在iOS在使用GCD的时候,我们把定义的任务追加到适当的Dispatch Queue中。Dispatch以FIFO(先进先出,First-In-First-Out)的顺序执行任务。在iOS中有两种队列,分别是串行队列和并发队列。

串行队列,很明显一次只能执行一个任务,而并发队列则可以一次性执行多个任务。iOS 系统就是使用这些队列来进行任务调度的,它会根据调度任务的需要和系统当前的负载情况动态地创建和销毁线程,而不需要我们手动地管理。

Read more »

iOS 多线程之NSThread

Posted on 2015-08-25

前言

多线程的好处不必多说,当用户下载资源,播放音频等耗时操作,都需要用到多线程。多线程为APP提供了良好的体验,在iOS开发中,Apple提供了多种多线程方案.

Read more »

Objective-C Runtime 使用

Posted on 2015-08-20

原来想写一下Runtime的实际应用,想了一下,自已才疏学浅,除了关联对象和Method Swizzle。但这两个知识点很多高人写得都很好,我觉得直接转一下就好了。哈哈~

##Encode小技巧
突然想起还有个encode的小技巧,虽然我觉得应该不少人知道这个吧,但作为一个代码段,我觉得这个小技巧还是挺有用的。主要是利用反射获取类的成员变量名,再加上KVO就可以获取值与设值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-(void)encodeWithCoder:(NSCoder *)aCoder{
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PersonalMessageModel class], &count);
for (int i= 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
free(ivars);
}

-(instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PersonalMessageModel class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [aDecoder decodeObjectForKey:key];
if (value) {
[self setValue:value forKey:key];
}
}

}
return self;
}

南峰子的技术博客与Runtime相关的文章,我觉得挺好的,而且API全面,有空去查查

Objective-C Runtime 中篇

Posted on 2015-08-19

objc_msgSend方法

在前面我们讲到[receiver message]会被编译器转化为

objc_msgSend(receiver, @selector(message))

同时,我们也知道在一个对象里面有个methodLists这样子的属性。今天我们就讲下大概是什么调用方法的呢?

首先判断一下receiver对象是否为空,在Objective-C中向nill发送消息是不会Crash的,取出receiver对象里面的cache方法列表,在里面查找方法。找不到的话,那就从methodList方法里面查找。如果再找不到,就按照我们之前说的元类那个图一样,一层一层往父类找。直到找到为止,如果确实找不到,那就执行消息转发。如下图:

Read more »

Objective-C Runtime 上篇

Posted on 2015-08-17 | In Objective-c

前言

Objective-C 是一门动态语言,在它里面有一个叫运行系统的东西,称之为runtime。runtime它究竟长什么样呢?为什么Objective-C调用对象的方法称为传递消息呢?本文将在下面回答这两个问题。

Read more »

Hexo使用方法记录

Posted on 2015-08-17

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Read more »
123

ChenJz

30 posts
8 categories
19 tags
RSS
© 2020 ChenJz
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4