iOS基础·OC高级篇

iOS开发--block、protocol(协议)

2016-03-21  本文已影响286人  元宇宙协会

其实block是苹果官方强烈推荐,比代理好使。
那么我们要定义block怎么做?

1、简单定义block
(1)有形参

int (^myBlock)(int, int);

(2)无形参

// 没有形参的无返回值block
void (^myBlock)();

2、利用block封装一段代码
(1)有形参

^(int a, int b){
  return a + b;
}

(2)无形参

^(){
  NSLog(@"------");
}

(3)无形参可以省略括号

^{
  NSLog(@"------");
}

3、如何在block中访问外部变量

int a = 20;
__block int b = 100;

// 定义一个block
void (^myBlock)();

// 封装一段代码
myBlock = ^{
  // 默认情况下可以访问外面变量的值,但是无法改变a的值
  
  // 如果想要改变外面的变量值,可以在变量前加上__block
  b = 20;
}

// 执行block
myBlock();

4、可以使用typedef定义block

//有时候频繁使用block可以使用typedef来定义block
typedef int (^myBlock)(int a, int b);

// 利用类型,定义
myBlock block;
myBlock b1, b2; 

// 可以利用类型直接赋值
b1 = ^(int a, int b){
     return a + b;
};

myBlock b3 = ^(int a, int b){
    return a * b;
};
protocol<协议>

用来声明一大堆方法(不能声明成员变量)
只要某个类遵守了这个协议,那么就拥有这个协议中的所有方法
只要父类遵守了某个协议,相当于子类也遵守了。
协议只有一.h文件,分类是有.h和.m文件

协议格式

@protocol 协议名称 <NSObject>
- (void)test;
@end
某个类遵守协议
       // 继承 :  // 遵守协议<>
@interface 类名 :父类 <协议名称>
@end
协议中的几个关键字
// 如果什么都不选,那么默认是@required,必须实现
 @required // 必须实现
 @optional // 可选的,不要求实现
基协议

NSObject是最基本的类,任何其他类都要继承它
<NSObject>是基协议,它中声明了很多方法,比如retain/release/description,
每一个新的协议都要遵守NSObject这个基协议

以后写一份协议,一定要遵守<NSObject>
变量保存对象遵守协议

定义一个变量,限制这个变量保存的对象也遵守某个协议
类名<协议名称> *变量名
SYCar <MyProtocol> *obj;
id<协议名称> 变量名
id <MyProtocol> oc;

声明属性遵守协议

在@property中声明属性也可以遵守协议来限制

@property (nonatomic, strong) 类名<协议名称>*属性名

@property (nonatomic, strong) Car <MyProtocol> *car

@property (nonatomic, strong) id <MyProtocol> car2;

开发注意点:
如果一个协议,只有一个类去遵守的话,写在类声明文件即可
如果一个协议,有多个类去遵守,那么写在外面。

分类也可以定义在单独的.h.m文件,也可以定义在原来类中。
1>一般情况下都是定义在单独文件(开发一般就是常用这种)
2>定义在原来类中的分类。

协议代理设计

我们通过代理可以达到一些自己无法处理的事情。

Paste_Image.png Paste_Image.png Paste_Image.png

代理中执行方法:


Paste_Image.png

一定要注意耦合性
所以代理必须要有协议,只有通过遵守协议,实现协议中的方法达到解决耦合性这个问题

1、生成代理协议


Paste_Image.png

2、谁成为代理谁遵守协议


Paste_Image.png

3、实现代理协议方法


Paste_Image.png

4、顺利解耦


Paste_Image.png

5、

上一篇 下一篇

猜你喜欢

热点阅读