IOS学习笔记-协议和代码块

来源:互联网 发布:wxpython python 3.4 编辑:程序博客网 时间:2024/04/28 16:19

用协议的方法是在类的@interface声明中列出协议的名称。采用协议就意味着你承诺实现该协议的所有方法。否则,编译器会生成警告来提醒你。

声明协议的方式:

@protocol MySuperDuberProtocol <MyParentProtocol>

@end

复制的种类:

1)浅层复制:不会复制所引用的对象,新复制的对象只会指向现有的引用对象。

2)深层复制:将复制所有的引用对象。

Objective-C 2.0中增加了两个新的协议修饰符:@optional@required。@optional代表必须要实现的方法,@required代表可以选择性去实现的方法。

代码块除了函数中的代码,代码块还包含变量绑定,它包含两种类型的绑定:自动型托管型自动绑定使用的是栈中的内存,而托管绑定是通过堆创建的。

代码块的特征:

1)返回类型可以手动声明也可以由编译器推导;

2)具有指定类型的参数列表;

3)拥有名称。

代码块的定义:void(^my_block)(void);

在声明代码块变量和代码块实现的开头位置都要使用幂操作符(^)。一般我们可以这样使用代码块:

<returntype> (^blockname)(list of arguments) = ^(arguments){body;};

本地变量会被代码块作为常量获取到。如果你想要修改他们的值,必须将他们声明为可修改的,也就是声明为_block类型的。有些变量是无法声明为_block类型的。它们有两个限制:

1)没有长度可变的数组;

2)没有包含可变长度数组的结构体。

使用代码块时的内存管理规则:

1)如果引用了一个Objective-C对象,必须要保留它。

2)如果通过引用访问了一个实例变量,要保留一次self(即执行方法的对象)。

3)如果通过数值访问了一个实例变量,变量需要保留。

GCD(Grand Central Dispatch):苹果公司为了减轻在多核上编程的负担而引入的一个概念。

如果你定义了一个属性并且没有指定关键字nonatomic作为属性的特性,编译器会生成强制彼此互斥的getter和setter方法。因为编译器生成了@synchronize(mutex,atomic)语句类确保彼此互斥。

一共有三种类型的队列:

1)连续队列:一连串任务需要按照一定的顺序执行。

2)并发队列:适合用于那些可以并行运行的任务。

3)主队列:使用dispatch_get_main_queue可以访问与应用程序主线程相关的连续队列。

有两种方式可以向队列中添加任务:

1)同步:队列会一直等待前面任务结束。

2)异步:添加任务后,不必等待任务,函数会立刻返回。推荐优先使用这种方式,因为它不会阻塞其他代码的运行。

在上下文对象弃用时调用的函数,通常被称为终结器(finalizer)函数。

如果想要使用操作,首先需要创建一个操作对象,然后将其指派给操作队列,并让队列执行它。一共有3种创建操作的方式:

1)NSInvocationOperation:如果你已经拥有一个可以完成工作的类,并且想要在队列上执行,可以尝试使用这种方式。

2)NSBlockOperation:这有些像包含了需要执行代码块的dispatch_async函数。

3)自定义的操作:如果你需要更灵活的操作类型,可以创建自己的自定义类型。你必须通过NSOperation子类来定义你的操作。

原创粉丝点击