MD5 即 Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 其作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
首先,创建桥接头文件 bridge.h
来包含需要引用的 Objective-C
头文件,并在项目中配置:
|
|
Quick notes
MD5 即 Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 其作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
首先,创建桥接头文件 bridge.h
来包含需要引用的 Objective-C
头文件,并在项目中配置:
|
|
时间轴是大家都很熟悉的特效,在网络上也有很多现成的资源,虽然轮子已经有很多,但是我们自己尝试来做一个也不失为是一种乐趣,下面我们通过 StoryBoard 和代码来完成一个时间轴的界面。
首先我们创建新的 Project
,删掉默认的 ViewController.swift
,和 MainStoryBoard
中的 ViewControlle r Scene
,现在我们就有了一个空的项目。
下面我们在 Main.StoryBoard
中拖进来一个 TableViewController
给它命名为 NoteTableViewController
,然后创建 New File - File
,选择 Cocoa Touch Class
,继承自 UITableViewController
,命名为 NoteTableViewController
。
然后将 NoteTableViewController
和 NoteTableViewController.Class
进行绑定,并给Main.StoryBoard
设置一个 Identity
,并勾选 Is Initial View Controller
。
下一步,选中 NoteTableViewController
下的 TableView
,将它的 Row Height
设置为60,Prototype Cells
设置为2。
下面,设置两个 Cell
,分别命名为 RightCell 和 LeftCell
,给每个 Cell
添加 3个Buttonh 和 1个UIView
。3个按钮命名依次为:middle delete edit
,宽度30,高度30,并给按钮设置对应的背景图片,并让3个按钮对齐,UIView
的宽度是2,高度30,背景颜色为黑色。
给 LeftCell
添加一个Label
,文本设置为右对齐,给 RightCell
添加一个 Label
,文本设置为左对齐。
最后,勾选 delete edit
两个按钮的 Hidden
选项,然后创建 New File - File
,选择 Cocoa Touch Class
,继承自 UITableViewCell
,命名为 NoteTableViewCell
。
因为线程是串行的,这意味着如果我们要下载一个图片,使它呈现在一个
UIImageView
里,那么这个线程必须要等待图片下载完成后,才能显示出来。为了解决这样的问题,我们需要用到多线程的技术,将下载图片交给子线程完成,将加载图片到UIImageView
交给主线程,这就涉及到一个问题,就是线程之间的通信。
以上面的问题举例,我们要在一个线程中下载图片,然后要另一个线程展示图片,苹果官方推荐,刷新界面的操作最好在主线程中完成,那么我们来实验一下,如果将展示图片的操作交给子线程,会发生什么。首先我们创建一个 UIImageView
并将它添加到 UIViewController
,然后我们创建一个子线程:
|
|
No.1 首先确保工程中有这个库;
No.2 进入 Build Phases
找到 Link Binary With Libraries
,添加这个库;
No.3 点击 Build Phases
页面左上角加号,点击 New Copy Files Phase
,名字改为 Copy FrameWorks
,Destination
设置为 FrameWorks
,将这个库添加进来即可。
首先来看这个方法:
|
|
下面这个是常见的 init
创建线程:
|
|
这两种创建方式有哪些不同呢?我们对比来看下:
init
是一个构造器,detachNewThreadSelector
是一个类型方法。detachNewThreadSelector
返回值是void
,也就是说没有返回值。detachNewThreadSelector
在调用后立即启动,不需要start
方法。
GCD全称是 Grand Central Dispatch,它是基于 C 语言开发的一套多线程开发机制,也是目前苹果官方推荐的多线程开发方法。
因此,程序员只需要告诉 GCD 想要执行什么任务,把任务放在对应的 block
里面。不需要编写任何线程管理代码。
首先介绍 NSThread
创建线程的方法:
|
|
public class NSThread : NSObject
从这里可以看出,NSThread
是继承自 NSObject
的类,它的创建是一个构造器 init
,所以使用实例化对象的方式就可以调用了。
|
|
现在我们来看一下,这个方法的几个参数,分别代表的含义。
形参名 | 形参类型 | 作用 | 方法填写 |
---|---|---|---|
target | AnyObject | 当前类的一个对象。是selector消息发送的对象。 | 一般是 self |
selector | Selector | 线程要执行的方法。只能接收一个参数。 | 创建方法传入 |
object | AnyObject? | selector线程函数的唯一传入值,可以是 nil 。 | nil |
所有基于C编写的app的入口都是main函数,但iOS应用程序有点不同。不同就是你不需要为iOS应用程序而自己编写main函数,当你使用Xcode创建工程的时候就已经提供了。除非一些特殊情况,否则你不应该修改Xcode提供的main函数实现,在下图中我们可以看到Xcode为我们生成了一个main.m文件:
线程是可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位。
共有堆,自有栈 , iOS 主线程栈和其他线程均默认为 512K。
堆可以理解为操作系统提供的一块内存,可以随意使用,在我们使用 new , alloc
时,分配的内存就是系统用堆提供的。
栈是操作系统给当前的应用程序分配的,仅供当前应用程序使用的内存空间,也就是给我们的线程分配的内存空间,这个空间是有限制的,它主要是用来定义一些函数内部的成员变量,栈里的数据其他程序不能访问。