发表于: 2016-12-22 23:45:40

2 800


今天完成的事情:复习协议,代码块
明天计划的事情:继续刚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的子类创建自己定义的。

还是有点懵逼。


返回列表 返回列表
评论

    分享到