发表于: 2016-12-22 23:45:40
2 1040
今天完成的事情:复习协议,代码块
明天计划的事情:继续刚OC
遇到的问题:那些大牛的博客浏览了一下,感觉还跟不上节奏的样子。
复制的种类问题:浅层复制(shallow copy)不会复制所引用的对象,新复制的对象只会指向现有引用对象,只复制了指针,引用对象没有复制。深层复制(deep copy)复制所有引用对象。
收获:
感觉一天除了吃饭就是在看书,看的还好慢。
协议:
可以用@protocol列出一组方法定义一个正式协议,采用协议后,对象就承诺时限该协议中列出的每一个要求实现的方法。
<NSCopying>协议
copyWithZone:方法完成对象深层复制。
@optional 指定的方法可选择实现。
@required 指定的方法必须实现。
这样可以使协议目的更明确。
协议和数据类型
id类型后跟<协议>,编译器就会知道你会接受任意类型对象,但前提是遵守该协议。检查对象是否能完成这个工作。
代码块和并发性:
代码块包含变量绑定,代码块有时也被称为闭包。
代码块包含两种类型的绑定:自动型和托管型;自动绑定使用栈中内存,托管型绑定通过堆创建。
代码块具有的特性:
1.返回类型可以手动声明也可以由编译器推导;
2.具有指定类型的参数列表;
3.拥有名称;
例;
returntype (^blockname)(list of argument) = ^(argument){body;};
编译器可以通过代码块的内容推导出返回类型,可以省略,如果代码块没有参数也可以省略。
例:
void(^blockname)() = ^{body;};
代码块可以访问与它相同的(本地)有效范围内声明的变量,代码块可以访问与它同时创建的有效变量。
例:
int value = 6;
int(^multiply_block)(int number) = ^(int number){return(value * number);};
int result = multiply_block(5);
printf("Result = %d\n", result);等于30
typedef关键字
typedef returntype (^blockname)(argument);
blockname 变量名 = ^(argument){bouy;};
代码块被声明后会捕捉创建时的状态,代码块可以访问函数用到的标准类型的变量;
1.全局变量,包括在封闭范围内声明的本地静态变量;
2。全局函数(不是真是的变量);
3.封闭范围内的参数;
4.函数级别(即与代码块声明时相同的级别)的_block变量,他们是可以修改的变量;
5.封闭范围内的非静态变量会被获取为常量。
6.objective-c的实例变量。
7.代码块内部的本地变量。
_block可以修改常量,但是有两个限制:
1.没有长度的可变数组;
2.没有包含可变长度数组的结构体。
代码块内部的本地变量与函数中的本地变量作用相同。
并发性:
Grand Central Dispatch(GCD)
解决线程管理麻烦,GCD是一个系统级别结束(system-level),可以在任意级别的代码中使用,因为他是运行在系统级别上的,
同步
mutex(互斥)确保两个线程不会再同一时间进入临界区。
@synchronized(language-level)拥有一个参数并可修改,他可以确保不同县城会连续的访问临界区的代码。
选择性能:
performSelectorInBackground:withObject:他能在后台执行一个方法。
调度队列:
GCD有三种调度队列:
1.连续队列:每个连续队列都会根据指派的的顺序执行任务,可以按自己的想法创建任意数量的队列,他们会并行操作任务。
2.并发队列:每个并发队列都能并发执行一个或多个任务。任务会根据指派到队列的顺序开始执行,无法创建连续队列,只能从系统提供的3个队列中选择一个使用。
3.主队列:应用程序中有效的主队列,执行的是应用程序的主线程任务。
用法:
连续队列:
按照一定顺序执行,便可以使用连续队列,执行顺序先入先出,异步提交不会死锁。
dispatch_queue_t my_serial_queue;
my_serial_queue = dispatch_queue_create("com.aqress.MySerialQueue1",NULL);
第一个参数是队列名称,第二提供队列特性。
并发队列:
并发运行任务,先入先出,且任务可在前一个任务结束前开始执行,一次运行的任务量无法预测;
每个程序都有三种并发队列可用:high,default,low;可以调用dispatch_get_global_queue方法引用
例;
dispatch_queue_t myQueue;
myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT/HIGH/LOW,0);
操作队列:
OC中有三种创建的方式:
1.NSInvocationOperation:如果已经拥有了一个可以完成工作的类,并且想要在队列上执行,可以使用这个方法。
2.NSBlockOperation:类似包含需要执行代码块的dispatch_async函数。
3.自定义操作:通过NSOperation的子类创建自己定义的。
还是有点懵逼。
评论