OC-通知+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又称为代码块,它是^符号开头的方法;一般用于多线程、网络通信。苹果公司从ios4开始主推block语法

block实体形式如下:

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

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

void (* cFunc)(void);

oc中block 跟指针函数很像

写了一个block变量ocFunc

void(^ ocFunc)(void);

一.不带参数的block-------------------------------------------------------------------------------------------------------------------

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

实现了一个block函数

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

【注】block函数是以;结尾

ocFunc=^(void)

{

NSLog(@"in blocks");

};

NSLog(@"befor blocks");

block函数的调用

ocFunc();

NSLog(@"after blocks");

二.带参数的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修饰符即可

时间: 2024-11-05 23:07:02

OC-通知+Block的相关文章

李洪强iOS开发之OC语言BLOCK和协议

OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么? 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性: (1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. 标识符 ^ (二)基本使用 (1)定义BLOCK变量 Int (^SumBlock)(int,int);//有参数,返回值类型为int Void (^MyBlock)()://无参数,返回值类型为空 (2)利用block封装代

(Object-C)学习笔记(五) --OC的Block

OC的Block 文大大的Block见解 http://www.cnblogs.com/wendingding/p/3709604.html Block跟方法差不多,随写随用,而且做完运算后能即时返回一个返回值,非常方便,大大提高了编程效率.但是不建议多用,因为Block会导致代码的易读性大大降低.

OC语言Block

OC语言Block 一.Block (一)简介  Block是什么?苹果推荐的比较特殊的数据类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. Block和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. Block的应用:(1)动画(2)多线程(3)集合遍历(4)网络请求回调 标识符 ^ (二)基本使用 (1)定义Block变量 Int (^SumBlock)(int,int);//有参数,返回值类型为int Void 

61 (OC)* 代理 block 通知 代理 kvo

1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高. block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除.delegate只是保存了一个对象指针,直接回调,没有额外消耗.就像C的函数指针,只多做了一个查表动作. 2.从使用场景区别block和delegate 有多个相关方法.假如每个方法都设置一个 block, 这样会更麻烦.而 delegate 让多个方法分成一组,只需要设置一次,

OC之Block的使用

一.Block定义 1.1定义 (1)Block是OC中的一种数据类型,在iOS开发中被广泛使用 (2)^是Block的特有标记 (3)Block的实现代码包含在{}之间 (4)大多情况下,以内联inline函数的方式被定义和使用 (5)Block与C语言的函数指针有些相似,但使用起来更加灵活 1.2示例代码 void(^demoBlock)() =^ { NSLog(@"demo"); }; int(^addBlock)(int, int) =^(int x, int y) { re

OC语言BLOCK和协议

一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. 标识符 ^ (二)基本使用 (1)定义BLOCK变量 int (^SumBlock)(int, int); // 有参数,返回值类型为int void (^MyBlock)():// 无参数,返回值类型为空 (2)利用block封装代码 (3)Block访

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

首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @property (nonatomic, strong) NSString *myName;//单例的属性,用于传值 +(DataSource*)sharedDataSource;//建立单例对象 @end .m文件 #import "DataSource.h" @implementati

iOS开发——语法OC篇&Block回顾

Block回顾 这里知识简单介绍一下关于Block的语法,如果你觉得这里很简单或者想学习更深入的的使用清查看记者之前写的使用block传值和高级Block使用: http://www.cnblogs.com/iCocos/p/4534281.html http://www.cnblogs.com/iCocos/p/4550169.html http://www.cnblogs.com/iCocos/p/4659878.html http://www.cnblogs.com/iCocos/p/46

OC 06 Block、数组高级

主要内容: ?.Block语法 ?.Block使? 三.Block实现数组排序 Block简介 Block:块语法,本质上是匿名函数(没有名称的函数) 标准C?面没有Block,C语?言的后期扩展版本,加?了匿名函数. C++.JS.Swift等语?,有类似语法,叫做闭包. Block语法和函数指针很相似. 回顾函数指针 函数指针(变量):存放函数地址(函数名)的指针变量. int (*p)(int x,int y) = sum; 函数指针类型:int (*)(int x,int y) 即:指向

swift中闭包和OC的block的对比

// //  ViewController.swift //  swift的函数和闭包 // //  Created by Ninesday on 16/6/23. //  Copyright © 2016年 Ninesday. All rights reserved. // import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do a