通知、block
===================================
通知
===================================
一.通知(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的更多相关文章
- 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,
首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...
- block中如何避免循环引用
使用 weak–strong dance 技术 block 可以直接引用 self,但是要非常小心地在 block 中引用 self.因为在 block 引用 self,可能会导致循环引用.如下例所示 ...
- Block编程值得注意的那些事儿
[深入浅出Cocoa]Block编程值得注意的那些事儿 [深入浅出Cocoa]Block编程值得注意的那些事儿 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循 ...
- OC语言的特性(二)-Block
本篇文章的主要内容 了解何谓block. 了解block的使用方法. Block 是iOS在4.0版本之后新增的程序语法. 在iOS SDK 4.0之后,Block几乎出现在所有新版的API之中,换句 ...
- iOS开发 -------- Block技术中的weak - strong
一 Block是什么? 我们使用^运算符来声明一个Block变量,而且在声明完一个Block变量后要像声明普通变量一样,后面要加; 声明Block变量 int (^block)(int) = NULL ...
- Linux mmc framework2:基本组件之block
1.前言 本文主要block组件的主要流程,在介绍的过程中,将详细说明和block相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API 2.1 struct mmc_ca ...
- Block编程注意的问题
一,前言 block 是在 iOS 4 中引入的新特性,它和 C++ 11 中的 lamba 表达式概念相似,有时候也被称为闭包.经过一段时间的使用,我发现要用对用好 block 还是有不少需要注 ...
- 手把手教你从Core Data迁移到Realm
来源:一缕殇流化隐半边冰霜 (@halfrost ) 链接:http://www.jianshu.com/p/d79b2b1bfa72 前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那 ...
- 手把手教你从 Core Data 迁移到 Realm
前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库.号称是用来替代SQLite 和 Core Data的.Realm有以下优点: 使用方便 Realm并 ...
- ReactiveCocoa Weak-Strong Dance
AC在应用中大量使用了block,由于Objective-C语言的内存管理是基于引用计数的,为了避免循环引用问题,在block中如果要引用self,需要使用@weakify(self)和@strong ...
随机推荐
- JavaScript:声明变量名的语法规则
一.语法规则 1.变量必须使用字母.下划线(_)或者美元符($)开始. 2.然后可以使用任意多个英文字母.数字.下划线(_)或者美元符($)组成. 3.不能使用JS关键词与保留字. 二.示例 var ...
- 小菜学习设计模式(四)—原型(Prototype)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- Oracle手边常用命令及操作语句
Oracle手边常用命令及操作语句 作者:白宁超 时间:2016年3月4日11:24:08 摘要:日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规操作. ...
- Windows Phone 的 TextBox 的实现 PropertyChanged
比如,View 的文本框 TextBox1 绑定了 ViewModel 的 Msg 属性, 当想把文本框输入的内容输入过程中实时更新到绑定的 Msg ,在Windows Phone 中是无法通过设置 ...
- js图片预加载
图片预加载有大体有几种方式 1.html标签或css加载图片. 显而易见我们使用img标签或者通过标签的background-image属性都可以实现图片的预加载.但是为了避免初次载入过多图片影响体验 ...
- 数据库设计(2/9):域,约束和默认值(Domains, Constraints and Defaults)
对于设计和创建数据库完全是个新手?没关系,Joe Celko, 世界上读者数量最多的SQL作者之一,会告诉你这些基础.和往常一样,即使是最专业的数据库老手,也会给他们带来惊喜.Joe是DMBS杂志是多 ...
- Struts2 源码分析——DefaultActionInvocation类的执行action
本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...
- Vuforia unity开发摄像头问题
Vuforia unity开发摄像头问题 项目一直在赶进度,写博的时间越来越少了~从事Unity开发也快两个月了,AR方向~ 使用的是高通家的SDK Vuforia...从工程融合一直到对unity和 ...
- 泛型(Generics)
Framework类库中的泛型 泛型可以使代码重用,提高开发效率 CLR允许在引用类型.值类型或接口中定义泛型方法: CLR允许创建泛型引用类型.泛型值类型(枚举不允许创建).泛型委托类型和泛型接口类 ...
- jquery easyui菜单树显示
目前做了一个easyui项目需要显示多级菜单,菜单配置到数据库中,因此每级菜单都需要到数据库中取,用了jQuery EasyUI方便多了. 效果体验:http://hovertree.com/texi ...