block的基本用法

block语法

1.代理协议和通知的区别 :两者的对象直接的耦合性不同.通知的代码的可读性太差.  代理,通知,block三种通信都实现了对象之间的解耦合. 通知的通信方式是1对多;代理,block是1对1

2.block(闭包):与函数相似,是一个匿名的函数代码快,此代码可以作为参数传递给其他对象

3. /*

局部的基本数据类型变量,进入到block中,num会变成常量。如果需要在block中对num进行修改,需要加上关键字__block (我们也可以用static关键字进行修饰,也可以设置成全局变量)

*/

__blockint num = 10;

MyBlock block1 = ^{

NSLog(@"num is %d", num);

//当没有加上__block时,错误,不能对常量进行自加操作

num++;

}

num = 20;

block1();

NSLog(@"num is %d", num);

/*

局部的OC对象进入到block时, 该对象会被retain一次,如果用__block修饰则不会(注意: block在堆区上时才会起到retain作用,所以下面要对block进行一次copy操作,将block从栈区copy到堆区上)

*/

__blockNSObject *obj = [[NSObjectalloc] init];

NSLog(@"%ld", obj.retainCount);

MyBlock block2 = ^{

NSLog(@"%ld", obj.retainCount);

};

[block2 copy];//将block copy到堆区上一份,就不会再受栈区的影响(那么会将这个Block copy到堆上分配,这样就不再受栈的限制,可以随意使用啦)

block2();

__blockPerson *ps = [[Personalloc] init];

MyBlock block3 = ^{

NSLog(@"%ld", ps.retainCount);

};

[block3 copy];

block3();

[ps release];

[block3 release];

4.Block的内存管理

在block里面引用一个实例变量(成员变量)时,该变量所在的对象会被retain一次

// self -> btn -> block -> self造成循环引用,断掉block->self

//  __blockSecondViewController *secondVC = self;创建secondVC作为self的中间变量(在SecondViewController类的内部 ,且在MRC情况下)

//在ARC中,__block关键字不能解决循环引用的问题,因为即使使用了__block关键字,它仍旧是一个strong类型的对象,进入到block块时,仍旧会被block持有,这个时候__block关键字起的作用仅仅只是表示该指针变量进入到block块是是一个可修改的变量.所以使用__weak,使类与对象之间产生弱引用关系

__weakSecondViewController *weakSelf = self;

BaseButton *btn = [[BaseButtonalloc] initWithFrame:CGRectMake(200, 200, 100, 100) WithBlock:^(UIButton *btn) {

//通常情况下,在block块中,我们再将__weak对象转换成一个strong对象,为了更方便拿到自身的成员变量

__strongSecondViewController *strongSelf = weakSelf;

[strongSelf.navigationControllerpopViewControllerAnimated:YES];

5.自定义类BlockAlertView.m文件中

复写父类多参数的方法,需要引入C语言的库函数#import <stdarg.h>

- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegatecancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...

{

self = [superinitWithTitle:title message:message delegate:selfcancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles,nil];

//获取多参数中otherButtonTitles后面的多参数

//定义一个指针函数

va_list p;

id test;//列表中的指针所指向的下一个参数

if (otherButtonTitles) {//如果otherButtonTitles存在,则遍历列表,如果不存在,则就不是多参数,无需遍历

va_start(p, otherButtonTitles);

while ((test = va_arg(p, id))) {//如果取到列表中的参数

[selfaddButtonWithTitle:test];//就给将参数添加到AlertView上,并给title赋值

}

va_end(p);

}

returnself;

}

在控制器RootViewController.m文件中,调用BlockAlertView的复写父类的初始化多参数方法

BlockAlertView *alert =[[BlockAlertViewalloc]initWithTitle:@"欢迎"message:@"HelloWorld"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"确定", @"退出",@"不再提示",@"再次提醒",nil];

alert.block = ^(NSInteger index){

NSLog(@"index----%ld",index);

};

[alert show];

时间: 2024-10-15 23:52:45

block的基本用法的相关文章

IOS中 Block简介与用法(一)

?Block简介: Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是"^",接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). 例如下面的一个例子: [cpp] vi

iOS中Block的基础用法

本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道Block的精妙之处. Block简介 Block是一种比较特殊的数据类型.它可以保存一段代码,在合适的时候取出来调用. Block的修饰 ARC情况下1.如果用copy修饰Block,该Block就会存储在堆空间.则会对Block的内部对象进行强引用,导致循环引用.内存无法释放.解决方法:新建一个

[HMLY]10.iOS中block的基础用法

本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道Block的精妙之处. Block简介 Block是一种比较特殊的数据类型.它可以保存一段代码,在合适的时候取出来调用. Block的修饰 ARC情况下1.如果用copy修饰Block,该Block就会存储在堆空间.则会对Block的内部对象进行强引用,导致循环引用.内存无法释放.解决方法:新建一个

block的常见用法

一.声明和定义 1.声明 声明方式:返回值(^block)(参数).声明时,参数变量名可以省略:使用时,参数变量名不能省略,不然会无法调用传入的参数 void(^block)(); void(^block)(int); int(^block)(int); 2.定义 无参无返回值.可以省略写 void(^block)() = ^{};void(^block)() = ^(){}; 有参无返回值. void(^block)(int) = ^(int a){}; 有参有返回值.返回值可以省略,也可以不

block的一些用法

__weak typeof(self) weakSelf = self的应用意思是声明了一个self类型的weakSelf,加上__weak表示它是弱引用的.整行代码就是给self定义了一个弱引用性质的替身.一般用在block上,因为block会copy它内部的变量,可能会造成循环引用,使用__weak性质的self代替self,可以切断block对self的应用,避免循环使用.如 1 if (nil == error) { 2 __weak typeof(self) weakSelf = se

Objective-C语言中的Block简介以及用法.

Block语法是在iOS4.0的SDK 中开始新增的, 在那时就已经有了超过400多个API使用了Block语法. Block对象又同样是继承与NSObject, 是C语言级别的语法和运行时特性. 和标准的C函数指针类似. 但其除了可执行语句外, 还可以类似对象可以保持状态数据. 和C语言的函数指针类似, 但不完全相同. 常用来作为回调函数使用. Block和函数的操作符对比: 函数指针使用的是 ‘*’ Block使用的是 ‘^’ 下面是例子: apple.h文件 #import <Founda

IOS block的一些用法例子

首先用一张图解释block的结构: 按照调用函数的方式调用块对象变量就可以了: int result = myBlock(5); // result是 35 例子1:利用block延迟方法的执行 /** * 在主线程中延迟调用方法 * * @param block 方法主体block块 * @param delay 延迟delay秒 */ - (void)performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay { i

iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

[摘要]这篇文章,首先在第1节中介绍Block的定义,以及与C里面函数的对比.然后,第2节介绍实际开发中经常会用到的Block语法形式,以供读者日后查阅.只知道怎么用却不知什么时候用?所以随后的第3节将介绍Block的应用场景.然而,用Block不当导致了Crash?所以,第4节有必要了解Block捕获变量的特性,以及循环引用的解决.另外,千万不要懒,一碰到Block就weak,要区分哪些不会引起循环引用.然而,如果对Block的内存机制不熟悉,也会导致Crash,所以第5节会介绍Block的内

猫猫学iOS 之BLOCK的妙用_利用block实现链式编程

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:场景 我们有个对象人,他有两个方法,一个是学习study,一个是跑步run, 这个人有个怪癖,跑完步之后必须学习,为了实现这个方法并且能调用方便,我们让跑步和学习都回返回自己这个对象作为下一次调用的快捷方式,代码如下: 调用: int main(int argc, const char * argv[]) { @autoreleasepool { //初始化