===================================

通知

===================================

一.通知(NSNotification)

// NSNotification 通知类,这个类中有 NSNotificationCenter 通知中心类

NSNotificationCenter* notification = [NSNotificationCenter defaultCenter];

// 添加了一个监听事件,其中,run1 则是触发的事件方法,@“run”是通知的名字

[notification addObserver:self selector: @selector(run1) name: @"run" object:nil];

// 多次调用发送通知的方法,会触发多次相应的响应方法(run1)

[notification postNotificationName: @"run" object:nil];

// 删除通知,如果想删除通知,就可以调用removeObserver这个方法

[notification removeObserver:self name:@"run" object:nil];

【注】通知用的时候要添加通知,不用的时候一定要删除通知,因为如果不删除,这个通知一直存在

二.【代理和通知对比】

// 代理:小明->小刚->小红->小李;结果:小李->小红->小刚->小明

// 通知:小明注册了通知;结果:小刚、小红、小李都可以给小明发送消息;

三.通知的注意事项

+ (void)test

{

xiaoming *xm = [[xiaoming alloc]init];

[xm test1];

//【注】不可以在类方法中添加监听方法,这样会导致程序崩溃

//    NSNotificationCenter* notification = [NSNotificationCenter defaultCenter];

//    [notification addObserver:self selector:@selector(run) name:@"run" object:nil];

//

//    [xiaogang xgTest];

}

- (void)test1

{

NSNotificationCenter* notification = [NSNotificationCenter defaultCenter];

[notification addObserver:self selector: @selector(run) name: @"run" object:nil];

//【注】添加监听事件多次,发送消息时会触发多次run方法

[notification addObserver:self selector: @selector(run) name: @"run" object:nil];

[notification addObserver:self selector: @selector(run) name: @"run" object:nil];

[notification addObserver:self selector: @selector(run) name: @"run" object:nil];

//【注】删除监听,会删除所有对应的name的监听

//  [notification removeObserver:self name: @"run" object:nil];

//【注】删除监听,会删除所有对应的name的监听,object后面的参数应根据addObserver方法中的参数来

[notification removeObserver:self name: @"run" object: @""];

[notification addObserver:self selector: @selector(run) name: @"run" object:nil];

[xiaogang xgTest];

}

===================================

block

===================================

一.认识block

block又称为代码块,它是^符号开头的方法;一般用于多线程、网络通信。苹果公司从ios4开始主推block语法

block实体形式如下:

^(传入的参数列表){行为主体(具体的代码实现)}

// c语言中声明了一个指针函数

void (* cFunc)(void);

// oc中block 跟指针函数很像

// 写了一个block变量ocFunc

void(^ ocFunc)(void);

1.不带参数的block

//【注】block语法,先执行{}外面的语法,只有调用block函数的时候,才会执行内部

// 实现了一个block函数

// ^(传入的参数列表){行为主体(具体的代码实现)}

//【注】block函数是以;结尾

ocFunc=^(void)

{

NSLog(@"in blocks");

};

NSLog(@"befor blocks");

// block函数的调用

ocFunc();

NSLog(@"after blocks");

2.带参数的block

// int 返回值类型;myblock1 block函数名称; int a,int b是形参; ^(int a,int b){};是行为主体

int (^ myblock1)(int a,int b)=^(int a,int b)

{

return a+b;

};

// block函数的调用

int result1 = myblock1(10,20);

NSLog(@"result1 = %d",result1);

// 一个函数中无法包含另外一个函数,block应运而生了

func(10,20);

int b = 8;

int (^myblock2)(int a) = ^(int a)

{

return b+a;

};

int result2 = myblock2(5);

NSLog(@"rusult2 = %d",result2);

myBlock myblock3 = ^(int a,int b)

{

return a+b;

};

int result3 = myblock3(90,8);

NSLog(@"rusult3 = %d",result3);

//【注】如果要在block内部对外部变量进行修改,则外部变量需要加__block修饰符(有2条下划线)

__block int sum;

void(^myblock4)(int a,int b) = ^(int a,int b)

{

sum = a +b;

};

myblock4(4,5);

NSLog(@"sum = %d",sum);

// A这个值会copy一份,block内部的操作是copy的这一部分,所以,外部无论如何对这个A进行修改,block内部都是不变的

int A = 8;

int(^myblock5)(int ) = ^(int a)

{

return A + a;

};

A = 5;

int result4 = myblock5(3);

NSLog(@"result4 = %d",result4);

//【注】需要注意的是,这里copy的值是一个变量的值,如果是一个记忆体的位置(地址),也就说,就是这个变量的指针的话,它的值在block内部会被改变

NSMutableArray* array = [[NSMutableArray alloc]initWithObjects:@"one",@"two",@"three", nil];

void(^myblock6)(void) = ^(void)

{

[array removeLastObject];

};

// 在第0个位置插入字符串@“0”;

[array insertObject:@"0" atIndex:0];

myblock6();

NSLog(@"array = %@",array);

// 对sum进行赋值,发现sum值被修改了

void(^myblock7)(void) = ^(void)

{

sum = 6;

};

myblock7();

NSLog(@"sum = %d",sum);

//        static int B = 8;

//        int (^myblock8)(int) = ^ (int a)

//        {

//            return B+a;

//        };

//        B  = 5;

//        int result5 = myblock8(3);

//        NSLog(@"result5 = %d",result5);

static int B = 8;

int (^myblock8)(int) = ^ (int a)

{

B  = 5;

return B+a;

};

int result5 = myblock8(3);

NSLog(@"result5 = %d",result5);

// [注]如果想把一个变量参与到block中运算修改,加一个static修饰符即可

通知、block的更多相关文章

  1. 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,

    首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...

  2. block中如何避免循环引用

    使用 weak–strong dance 技术 block 可以直接引用 self,但是要非常小心地在 block 中引用 self.因为在 block 引用 self,可能会导致循环引用.如下例所示 ...

  3. Block编程值得注意的那些事儿

    [深入浅出Cocoa]Block编程值得注意的那些事儿   [深入浅出Cocoa]Block编程值得注意的那些事儿 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循 ...

  4. OC语言的特性(二)-Block

    本篇文章的主要内容 了解何谓block. 了解block的使用方法. Block 是iOS在4.0版本之后新增的程序语法. 在iOS SDK 4.0之后,Block几乎出现在所有新版的API之中,换句 ...

  5. iOS开发 -------- Block技术中的weak - strong

    一 Block是什么? 我们使用^运算符来声明一个Block变量,而且在声明完一个Block变量后要像声明普通变量一样,后面要加; 声明Block变量 int (^block)(int) = NULL ...

  6. Linux mmc framework2:基本组件之block

    1.前言 本文主要block组件的主要流程,在介绍的过程中,将详细说明和block相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API 2.1 struct mmc_ca ...

  7. Block编程注意的问题

    一,前言   block 是在 iOS 4 中引入的新特性,它和 C++ 11 中的 lamba 表达式概念相似,有时候也被称为闭包.经过一段时间的使用,我发现要用对用好 block 还是有不少需要注 ...

  8. 手把手教你从Core Data迁移到Realm

    来源:一缕殇流化隐半边冰霜 (@halfrost ) 链接:http://www.jianshu.com/p/d79b2b1bfa72 前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那 ...

  9. 手把手教你从 Core Data 迁移到 Realm

    前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库.号称是用来替代SQLite 和 Core Data的.Realm有以下优点: 使用方便 Realm并 ...

  10. ReactiveCocoa Weak-Strong Dance

    AC在应用中大量使用了block,由于Objective-C语言的内存管理是基于引用计数的,为了避免循环引用问题,在block中如果要引用self,需要使用@weakify(self)和@strong ...

随机推荐

  1. ES6 - Note7:Generator函数

    Generator函数 1.Generator函数是ES6增加的异步编程解决方案之一,与普通的函数行为完全不同,类似于一个状态机,内部封装了多个状态. 在函数定义的形式上,跟普通函数差不多,有两处不同 ...

  2. [翻译]利用顶点位移的VR畸变校正

    文章英文原网址: http://www.gamasutra.com/blogs/BrianKehrer/20160125/264161/VR_Distortion_Correction_using_V ...

  3. 使用PL/SQL工具比对表结构,同步表结构

    需求:Oracle数据库,B库和C库,某些表的表结构不一致,现在要求以C库为标准,同步更新B库表结构PL/SQL 连接到C库, Tools --> Compare User Objects .. ...

  4. 简析将shp导入Oracle并利用geoserver将导入的数据发布

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.环境准备 1.1 软件准备 首先要安装有支持空间数据的Oracle ...

  5. 从SqlServer转手Oracle的一些坑

    为将SqlSugar ORM转制成OracleSugar ORM 本想一天搞定,凭着经验不看任何Oracle资料就直接强上了,但是从配置PLSQL和一些语法区别带来了很多坑让我进度放缓 这个贴子对于身 ...

  6. WPF CheckBox 自定义样式

    WPF 自定义样式.CheckBox <Style x:Key="EmptyCheckBox" TargetType="CheckBox"> < ...

  7. 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(一)

    (一)前言 本文主要介绍了实践部署AzurePack的Website Cloud的过程.在部署之前, 首先要对AzurePack有个基本的了解.   Azure Pack是微软的私有云方案,具有弹性. ...

  8. de4dot3.14更新文件打包下载

    刚发现de4dot更新了,虽然只是10月份的文件更新,并未发布新的release,但好多人还不会编译... 关于de4dot有何功能就不再讲了. 本文主要提供编译通过后的打包文件下载. 首先下载de4 ...

  9. 背水一战 Windows 10 (23) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过 ButtonBase 触发命令

    [源码下载] 背水一战 Windows 10 (23) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过 ButtonBase 触发命令 作者:webabcd ...

  10. poj2186--tarjan+缩点

    题目大意:       每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...