一):block学习总结

block :用来保存一段代码。

1、block 特点:
  1> Block封装了一段代码,可以在任何时候执行 
  2> Block可以作为函数或者函数的返回值,而其本身又可以带输入参数或返回值
  3> 苹果官方建议尽量多用block,在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
  4> Block可以在程序运行时凭空产生一个代码保存起来

 2、block的标志:^

 3、block跟函数很像

1> 可以保存代码
  2> 有返回值
  3> 有形参
  4> 调用方式一样
 4、定义block变量(没有形参)
  1> myblock是变量名,后面的()代表没有形参
   void (^myblock)() = ^(){
   NSLog(@"-----------");
   NSLog(@"-----------");
   };
  2> 没有形参可以省略后面的小括号
  void (^myblock)() = ^{
      NSLog(@"-----------");
      NSLog(@"-----------");
  };

3> 利用block变量调用block内部的代码
  myblock();
 
5、定义指向函数的指针int(*p)(int, int); 能用指向函数的指针做的东西一般用block替代

6、定义block变量(有形参)

1> 返回值是int,接收两个int类型的参数
  int (^sumblock)(int,int) = ^( int n1, int n2 ){
      return n1+n2;
  };
  2> 调用
  int a =  sumblock(3,4);
  3> 输出
  NSLog(@"%d", a);

7、使用typedef定义指向函数的指针类型

typedef int (*SumP)(int,int);

8、使用typedef定义block类型

1> typedef int (^MyBlock)(int,int);
  2> 用block计算两个值的和
  MyBlock sumBlock = ^(int  a, int b){
      return a + b;
   };

小结

block要掌握的东西

 1、如何定义block变量

int (^sumBlock)(int,int);
 void(^myBlock);
 
 2、如何利用block封装代码

1> 有形参
 ^(int a, int b) {
    return a-b;
 }
  2> 没有形参
 ^() {
    NSLog(@"----");
 }
 
 ^() {
 NSLog(@"----");
 }
 
 3、block访问外面变量
  1> block内部可以访问外面的变量
  2> 默认情况下,block内部不能修改外面的局部变量
  3> 给局部变量加上__block,这个局部变量就可以在block内部修改
 
 4、利用typedef定义block类型
 
 typedef int (^MyBlock)(int, int);   以后就可以利用MYBlock这种类型来定义block变量
 
  1> 先定义变量再进行赋值
MyBlock b1,b2;

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

2> 定义变量同时赋值
MyBlock b3 = ^(int a, int b){
    return a+b;
};

二) protocol学习总结

 1、定义了一个叫MyProtocol的协议

1> @protocol仅仅是用来声明方法的,声明完方法后等着类来实现
  2> 只要类遵守了这个协议就意味着这个类拥有了这个协议的所有方法声明
  3> 对这个方法可以加个关键字来约束这个方法要不要实现,@required代表必须实现,不实现就会发送警告,默认的就是这个@optional可以不实现
  4> NSObject,它是一个基协议,最根本最基本的协议
    protocol MyProtocol
    @required  必须实现
    - (void)test;
    @optional  可以不实现
    - (void)test2;
    @end

 2、协议的遵守

1> 只有一个类遵守了某一个协议,就拥有了这份协议中的所有方法声明
   2> : 继承父类
   3> <> 遵守协议
   4> 可以遵守多个协议,在<>里面协议之前用逗号隔开
  @interface Person : NSObject
  @end
   5> 要求obj3保存对象必须遵守Myprotocol
   NSObject *obj3 = [[NSObject alloc] init];
   6> 代表利用set方法设置这个对象的时候,这个对象必须遵守这个协议
  @property (nonatomic, strong) id obj;

 3、协议遵守协议

一个协议遵守了另外一个协议,就可以拥有这份协议的所有方法声明
  @protocol MyProtocol3

4、协议的规范

1> 告诉编译器这两个家伙是个协议,可以取代import
   2> 这样在.m文件里就要包含协议的.h头文件
   3> 遵守原则,先写协议,真正要用的时候再写头文件,提高性能
  @protocol MyProtocol2;
  @protocol MyProtocol3;

总结

1、协议的定义
 @protocol 协议名称
 // 方法声明列表
 @end
 
 2、如何遵守协议
  1> 类遵守协议
 @interface 类名 :父类名 <协议名称1,协议名称2>
 @end
 
  2> 协议遵守协议
 @protocol 协议名称 <其他协议名称1,其他协议名称2>
 @end
 
 3、.协议中方法声明的关键字
  1> @required(默认)
 要求实现,如果没有实现会发生警告
  2> @optional
 不要求实现,怎样都不会有警告
 
 4、定义一个变量的时候,限制这个变量保存的对象遵守某个协议
  1> 类名<协议名称> *变量名;
  2> id<协议名称> 变量名;
  3> NSObject *obj;
  4> id obj;
 如果没有遵守对应的协议,编译器会警告
 
 5、@property中声明的属性也可以用做一个遵守协议的限制
  1> @property (nonatomic, strong) 类名<协议名称> *属性名
  2> @property (nonatomic, strong) id<协议名称> 属性名
  3> @property (nonatomic, strong) Dog *dog;
  4> @property (nonatomic, strong) id dog;
 
 6、协议可以定义在单独.h文件中,也可以定义在某个类中
  1>如果这个协议只用在某个类中,应该把协议定义在该类中
  2>如果这个协议用在很多类中,就应该定义在单独文件中
 
 7、分类可以定义在单独.h文件中,也可以定义在原来类中
  1> 一般情况下,都是定义在单独文件中
  2> 定义在原来类中的类,只要求能看懂语法

8、基协议
  1> NSObject是个基类,最根本最基本的类,任何类最终都要继承他
  2> 其实还有个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
  3> NSObject协议中声明很多最基本的方法,比如description,retatin、release
  4> 建议每个协议都要遵守基协议

protocol的代理

1> 仅仅告诉编译器Button是一个类
@class Button;
2> 定义一个协议,并且遵守基协议
@protocol ButtonDelegate
3> 监听器的思想,当某个按钮被点击了会告示他哪个按钮被点击了
- (void)onClick:(Button *)but;
@end
4> 使Button 这个类遵守协议
@interface Button : NSObject
- (void)click;
5> 声明中的属性遵守这个协议
@property (nonatomic, retain) id delegate;
@end
@implementation Button
6> 防止unrecognized selector sent to instance 0x100114f10,方法未实现或没有这个方法,判断有没有实现这个方法
- (void)click
{
    如果_delegate实现onClick:方法,就调用这个方法
    if ([_delegate respondsToSelector:@selector(onClick:)])
    {
         按钮被点击了就应该通知监听器,并且告诉监听器哪个按钮被点击了
        [_delegate onClick:self];
    }
    else
    {
        NSLog(@"监听器没有实现onClick:方法");
    }
}
@end

block作为代理回调
#import
1> 仅仅告诉编译器Button是个类
@class Button;
2> 用typedef定义block类型,没有返回值
typedef void (^MyButton)(Button *);

@interface Button : NSObject
3> 定义一个自动生成MyButton类型的setter和getter,生成_btn这个成员变量
@property (nonatomic, assign) MyButton btn;
- (void)click;
@end

@implementation Button
4> 方法实现,用_btn变量调用block内部的代码
- (void)click
{
    调用block
     _btn(self);
}
@end

int main()
{
    @autoreleasepool {
        Button *b = [[[Button alloc] init] autorelease];

调用setter方法
       b.btn = ^(Button *btn){
       
            NSLog(@"点了这个-%@按钮", btn);
       };
       
 调用方法
       [b click];
 
    }
    return 0;
}

补充:判断stu有没有遵守这个协议
 Student *stu = [[[Student alloc] init] autorelease];
       
        if ([stu conformsToProtocol:@protocol(Study)])
        {
            NSLog(@"%@遵守了这个协议",stu);
        }

黑马程序员_ Objective-c 之block、protocol学习笔记的更多相关文章

  1. 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

    黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...

  2. 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean

    8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...

  3. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  4. 黑马程序员_ JAVA中的多线程

    ------- android培训.java培训.期待与您交流! ---------- 尽管线程对象的常用方法可以通过API文档来了解,但是有很多方法仅仅从API说明是无法详细了解的. 本来打算用一节 ...

  5. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  6. 黑马程序员_ Objective-c 面向对象笔记详解

    1)类,对象,方法 类 类名: 1) 类名的第一个字母必须是大写 2) 不能有下划线 3) 多个英文单词,用驼峰标识 类的声明和实现 类的声明 @interface 类名 : NSObject { @ ...

  7. 黑马程序员_ Objective-c 概述及面向对象与三大特性

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...

  8. 黑马程序员_ Objective-c 之Foundation笔记(二)

    NSArray NSArray的创建 NSArray *array = [NSArray arrayWithObject:@“jack”]   创建单个元素 NSArray *array3 = [NS ...

  9. 黑马程序员_ Objective-c 内存管理笔记

    引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法 ...

随机推荐

  1. MySQL集群在断网后再启动报"Unable to start missing node group"问题处理

    总所周知,MySQL集群又名ndb cluster,而ndb就是network based database的简称,数据库节点之间依靠网络来通信和保证数据分块间的一致性.今天由于机房交换机损坏,导致集 ...

  2. ghj

    如果对同一个元素的定义有多种,以最接近(最小一级)的定义为最优先,例如有这么一段代码 Update: Lorem ipsum dolor set 在CSS文件中,你已经定义了元素p,又定义了一个cla ...

  3. service的简单使用

    Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy 我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的. ...

  4. photoshop,黑白转彩色单色

    方法一: 打开 色相/饱和度 面板,勾选上 着色, 然后调节 明度 滑块. 方法二: 前面方法的缺点是会将修改直接塌陷到图层,如果想不塌陷,可以使用色相蒙板: 同样勾选 着色

  5. Hessian最佳实践

    前言:本文主要介绍‘独立的Hessian技术’与‘结合Spring技术’的两种Hessian接口开发模式及代码示例. 一.独立的Hessian技术开发步骤 Hessian-Java服务器端必须具备以下 ...

  6. c#操作access,update语句不执行的解决办法

    update access数据库时,使用了参数化的方式,结果不报错,但是数据也没有更新.后来发现access使用参数化时,参数位置必须和赋值顺序相同才行,否则更新时就会出现数据无法更新但是也不报错的怪 ...

  7. -Three.js开发指南---用three.js创建你的第一个三维场景(第一章)

    本章主要做了下面的工作 1 生成一个简单的场景,该场景的物体只有平面和坐标轴 2 在第一个demo的基础上添加光源和方块物体,并生成阴影 3 在第二个demo的基础上,增加动画,使得方块进行旋转 4 ...

  8. CentOS 6.5下配置iSCSI网络存储

    一.简介 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行 SCSI协议,使其能 ...

  9. [2014.01.27]WFsoft.wfLibrary.wfVerifyImage 1.8

    全新开发的验证码图片控件--WFsoft.wfLibrary.wfVerifyImage,使用简单,功能强大.     完全支持.net 2.0编写,对下一代操作系统平稳过渡.     同时支持.ne ...

  10. 16、java中的异常处理机制

    异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...