• 问题总会出现,不过解决问题的方法也会出现!!!

OC加强学习笔记03

学习笔记 小雨 520次浏览 已收录 0个评论

—— ——-

1-block的概念及基本使用

1、block的基本概念

Block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,Block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响。

你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程。作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。

由于Objective-C和C++都是衍生自C,block被设计为同时兼容这三种语言。

2、block的基本用法

用^操作符来声明一个Block变量,并指明Block述句的开始。Block的主题部分包含在{}内,像下面的例子中一样(与C语法一样,“;”指明语句的结束);

OC加强学习笔记03

(1)block最简单形式

定义格式:

void (^block名)()= ^{代码块}

使用格式:

block名();

2-block的typedef

1、函数指针回顾

(1)函数指针使用

函数指针变量定义的一般形式为:

类型说明符(*指针变量名)();

其中“类型说明符”表示被指函数的返回值的类型。

“(*指针变量名)”表示“*”后面的变量是定义的指针变量。

函数指针的使用

int sum(int x,int y){

return x+y;

}

int jian(int x,int y){

return x-y;

}

int cheng(int x,int y){

return x*y;

}

int chu(int x,int y){

return x/y;

}

定义函数指针

技巧:

(1)把函数的声明拷贝过来

(2)把函数名换成(*函数指针变量名)

(3)形参名可写可不写

int(*p)(int x,int y);

用法:p=sum;

p=jian;

调用:p(2,3);

(2)函数指针别名

typedef int(*NewType)(int x,int y);

NewType f1,f2,f3;//f1实际类型 int(*f1)(int x,int y);

2、block的typedef

Typedef void(^myblock)();

利用typedef定义block类型(和指向函数的指针很像)

格式:

typedef 返回值类型(^block变量名)(参数类型列表);

Typedef int(^MyBlock)(int ,int);

速记符:

以后就可以利用这种类型来定义block变量了。

OC加强学习笔记03

OC加强学习笔记03

有参数block别名

OC加强学习笔记03

有参有返回值block定义新的类型

OC加强学习笔记03OC加强学习笔记033-block访问外部变量

(1)在block内部可以访问block外部的变量

在block内部可以使用外部变量,

但是注意,这是一个新的内存空间变量

OC加强学习笔记03

OC加强学习笔记03

block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域。

OC加强学习笔记03

(2)在block内部不可以修改block“外部的变量”

非局部变量会以const变量被拷贝并存储到block中,也就是说block对其是只读的。如果曾是在block内部给make变量赋值,会抛出编译器错误。

OC加强学习笔记03

OC加强学习笔记03

冻结中的非局部变量是一个常量值,这也是一种默认的安全行为——因为这可以防止在block中的代码对非局部变量做了意外的修改。

OC加强学习笔记03

给局部变量加上_ _block关键字,则这个局部变量可以在block内部进行修改。

OC加强学习笔记03

注意:

一、静态变量和全局变量,在加和不加_ _block都会直接引用变量地址。也就意味着可以修改变量的值。在没有加_ _block参数的情况下。

全局block:定义在函数外面的block是global的:另外如果函数内部的block,但是没有补货任何自动变量,那么它也是全局的。

栈block:区别为:是否引用了外部变量

堆block:则是对栈block copy得来。对全局block copy不会有任何作用,返回的依然是全局block。

二、常量变量(NSString *a=@”hello”;a为变量,@“hello”为常量。)——不加_ _block类型block会引用常量的地址(潜拷贝)。加_ _类型block会去引用常量变量(如:a变量,a=@“abc”.可以任意修改a指向的内容。)的地址。

如果不加_ _block直接在block内部修改变量,会编译报错。block内部改变了是只读的。

5-block作为函数的返回值

步骤:

(1)使用typedef定义一个新的类型

OC加强学习笔记03

(2)使用新类型作为函数的返回值

OC加强学习笔记03

(3)定义变量接收函数返回的值(block类型)

(4)调用block

OC加强学习笔记03

OC加强学习笔记03

6-block的使用场景2

(1)使用typedef定义新类型

OC加强学习笔记03

(2)定义返回值函数(做了大量判断的)

OC加强学习笔记03

(3)修改函数

OC加强学习笔记03

(4)for循环调试

OC加强学习笔记03

7-block使用技巧及注意

1、block使用技巧及注意

(1)block结构的快速提示:

输入:inlineBlock得到如下提示:

OC加强学习笔记03

生成如下代码:

OC加强学习笔记03

(2)block变量用作方法的参数的时候

最好把参数类型列表部分加上 具体的形参名

OC加强学习笔记03

直接写代码就可以了

OC加强学习笔记03

注意:

OC加强学习笔记03

8-protocol概念及基本使用

1、protocol的基本概念

在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面,Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。

这个里面可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。

2、protocol的使用流程

协议的使用流程:

定义协议->在类中采用指定的协议->实现协议中的方法(注意方法有必须实现和选择实现两种)

如图:

OC加强学习笔记03

(1)定义协议

协议的定义

OC加强学习笔记03

注意:协议默认的要采纳NSObject的协议

(2)采纳协议

(a)类遵守协议

创建类的时候遵守某个或者某几个协议

OC加强学习笔记03

某个协议也遵守某个或者某些协议,一个协议可以遵守其他多个协议

(a)协议遵守协议

OC加强学习笔记03

(b)多个协议之间用逗号,隔开。

OC加强学习笔记03

(3)实现协议中的方法

9-protocol的基本使用

(1)定义协议

协议的定义

OC加强学习笔记03

注意:

协议默认的要采纳NSObject的协议

OC加强学习笔记03

(2)采纳协议

注意:采纳协议要先把采纳的协议引入过来

(a)类遵守协议

某个类遵守某个协议

OC加强学习笔记03

(b)协议遵守协议

OC加强学习笔记03

(3)实现协议中的方法

如果一个类遵守了某个协议

刚只需在这个类的实现(.m)文件中,实现协议的方法就可以了

Person.h

OC加强学习笔记03

使用

OC加强学习笔记03

2、使用图形界面创建协议

OC加强学习笔记03

OC加强学习笔记03

OC加强学习笔记03

OC加强学习笔记03

OC加强学习笔记03

OC加强学习笔记03

10-protocol其他用法

1、protocol的使用注意

OC中的协议(protocol)使用注意:

(1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。

(2)只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。

(3)只要父类遵守了某个协议,那么子类也遵守。

(4)Protocol声明的方法可以让任何类去实现,Protocol就是协议

(5)OC不能继承多个类(单继承)但是能遵守多个协议。继承(:)遵守协议(<>)

(6)基协议:<NSObject>是基协议,最根本最基本的协议,其中声明了很多最基本的方法

(7)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明

(1)协议之间可以有继承关系

使用Protocol时还需要注意的是:

1、Protocol也可以采纳其他的协议,比如:

@protocol A

-(void)methodA;

@end

@protocol B<A>

-(void)methodB;

@end

如果你要遵守B协议,那么methodA和methodB都需要实现。

OC加强学习笔记03

(2)类如果采纳协议后,实现了协议的方法,这些方法可以被子类继承

比如:

Person类采纳了Run和Work两个协议,并实现了两个方法

Student类继承了Person类,则此时Student类中可以调用和重写协议中的方法(实际上是子类Student 继承自Person的方法)

OC加强学习笔记03

OC加强学习笔记03

OC加强学习笔记03

2、protocol基协议介绍

NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它,它还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议

NSObject协议中声明很多最基本的方法

description

retain

release

建议每个新的协议都要遵守NSObject协议

11-protocol中@required和@optional

@required和@optional是协议方法声明中的两个关键字

他们主要用于控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流

@public

@protected

@private

@package

@required:这个方法必须要实现(若不实现,编译器会发出警告)

OC加强学习笔记03

OC加强学习笔记03

12-protocol类型限制

设定情景:

某逗比程序员A希望找一个会做饭、洗衣服的女生做女朋友,有国企工作的优先。

满足条件的女生都可以向他发送消息

从题目中我们得到要求:

(1)会做饭

(2)会洗衣服

(3)有份好工作

得到协议如下:

OC加强学习笔记03

(1)使用id存储对象时,对象的类型限制

格式:id<协议名称>变量名

如:id<Myprotocol>bbj1;

OC加强学习笔记03

OC加强学习笔记03

(2)对象赋值时类型限制

使用类也同样如此

格式:类名<协议名称>*变量名

OC加强学习笔记03

(3)对象关联关系下,对象的类型限制

设定情景:

某屌丝程序员B想养一只会算术的狗。

从题目中我们得到要求:

(1)人拥有一条狗

(2)狗必须会算算术

OC加强学习笔记03

OC加强学习笔记03

OC加强学习笔记03

2、id和instancetype的区别

id和instancetype的区别

(1)instancetype只能作为函数或者方法的返回值

(2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量

(3)instancetype对比id的好处

*能精确地限制返回值的具体类型

13-protocol代理设计模式引入

OC加强学习笔记03

14-protocol代理设计模式

MVC

m – model

v – view

c – controller

1、protocol代理设计模式概念

代理模式概念

传入的对象,代替当前类完成了某个功能,称为代理模式

利用协议实现代理模式的主要思路为:

(1)定义一个协议,里面声明代理类需要实现的方法列表,比如这里一个代理类需要实现feedBaby与HongSleep方法

(2)创建一个代理类(比如BaoMu),遵守上面的代理协议

(3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量

(4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法

(5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值

2、protocol代理模式应用场合

代理设计模式的场合:

*当对象A发生了一些行为,像告知对象B(让对象B成为对象A的代理对象)

*对象B监听对象A的一些行为(让对象B成为对象A的代理对象)

*当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

(1)监听器的场合

*Teacher想监听Baby的一些行为

(2)通知的场合

*Baby发生了一些行为,想告知Teacher

(3)有些事情,不想自己处理,想交给别人处理

*Baby发生了一些行为,但是自己不会处理,可以交给Teacher处理


本博客内容既有转载自网络的内容,也有本作者原创内容,仅供学习与交流之用
如有侵权或者错误之处,请及时在下方留言!
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址