[Objective-C] 020_ Block

1.定义和使用Block

 1 #import "ViewController.h"
 2
 3 @interface ViewController ()
 4
 5 @end
 6
 7 @implementation ViewController
 8
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11
12     //定义block 无返回值,无参数
13     void (^nameBlock)() = ^ () {
14         NSLog(@"姓名: Block");
15     };
16
17     //定义block 有返回值,有参数
18     int (^ageBlock)(int) = ^(int age) {
19         NSLog(@"年龄: %d",age);
20         return age + 1;
21     };
22
23     //调用block
24     nameBlock();
25     int age = ageBlock(3);
26     NSLog(@"》》》年龄:%d",age);
27     nameAndAgeBlock(@"SD.Team",2015);
28 }
29
30 void (^nameAndAgeBlock)() = ^(NSString *name,int age) {
31     NSLog(@"姓名:%@,年龄:%d",name,age);
32 };
33
34 - (void)didReceiveMemoryWarning {
35     [super didReceiveMemoryWarning];
36 }
37
38 @end
39
40 Block 定义与使用

  运行结果:
  
  通过运行上面的简单代码示例,可以得知:
    [1].在类中,定义一个Block变量,就像定义一个函数。
    [2].Block可以定义在方法内部,也可以定义在方法外部。
    [3].只有调用Block时候,才会执行其{}体内的代码。

2.__block关键字

  在Block的{}体内,是不可以对外面的变量进行更改的,将会报错(Variable is not assigning (missing __block type)),比如下面:

1 - (void)viewDidLoad {
2     [super viewDidLoad];
3     int myAge = 25;
4     void (^updateAge)(int) = ^(int age){
5         myAge = myAge + age;
6         NSLog(@"age:%d",myAge);
7     };
8 }

  要如何更正才能对外面的值呢?通过添加__block 关键字即可

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     __block int myAge = 25;
 4     void (^updateAge)(int) = ^(int age){
 5         myAge = myAge + age;
 6         NSLog(@"age:%d",myAge);
 7     };
 8
 9     updateAge(3);
10 }


3.Block作为property属性

  如有一需求:在ViewController中,点击设置按钮,push到下一个页面SettingViewController,在SettingViewController的age输入框TextField中更新年龄,返回的时候,在ViewController的年龄Label上面显示已更新的年龄。可以通过delegate 来实现,delegate前面讲过了,这次我们就用block来实现.
  SettingViewController:

 1 //SettingViewController.h 文件
 2 @interface SettingViewController : UIViewController
 3 @property (nonatomic, copy) void (^updateAgeBlock)(NSString *age);
 4
 5 @end
 6
 7 //SettingViewController.m 文件
 8 - (IBAction)updateAgeBtnClicked:(id)sender {
 9     if (self.updateAgeBlock) {
10         self.updateAgeBlock(self.ageTextField.text);
11     }
12     [self.navigationController popViewControllerAnimated:YES];
13 }

  ViewController:

 1 - (IBAction)settingClicked:(id)sender
 2 {
 3     SettingViewController *settingVC = [[SettingViewController alloc] initWithNibName:@"SettingViewController" bundle:nil];
 4     settingVC.updateAgeBlock = ^(NSString *age){
 5         [self updateAgeLabel:age];
 6     };
 7     [self.navigationController pushViewController:settingVC animated:YES];
 8 }
 9
10 - (void)updateAgeLabel:(NSString *)age
11 {
12     self.ageLabel.text = age;
13 }

我们通过block方式同样达到了delegate的效果。

时间: 2024-08-08 22:05:48

[Objective-C] 020_ Block的相关文章

Block 简介

1.Blocks简介 Block字面意思就是代码块 iOS4.0.Mac OS X 10.6开始Apple引入的特性 Block是Objective C语言中的对象 但是与NSObject有所区别 Block是特殊的Objective C对象 Block 对象提供了一个使用 C 语言和 C 派生语言(如 Objective-C 和 C++)来创建表达式作为一个特别的函数.在其他语言和环境中,一个block对象有时候被称为“闭包(closure)”.在这里,它们通常被口语化为”块(blocks)”

到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf

到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf Objective C 的 Block 是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发.异步任务.但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle)—— Block 会 retain ‘self’,而 ‘self‘ 又 retain 了 Block.因为在 ObjC 中,直接调用一个实例变量,会被编译器处理成 ‘self->theVar’,’self’ 是一个

Objective-C基础之_ weak, _ strong , __ block

上一篇文章中对于block做了一个全面的剖析和理解,那么在OBjective-C的block使用中我们难免会用到以上几个关键字,其实对于__block上篇文章已经做了解释,这篇文章,我会做几个关键字的区别和总结,来加深认识和理解. 上篇文章知道 clang -rewrite-objc 可以将OC代码转化成C代码C++代码,如果变量加上_ weak修饰,会发现无法转化,提示:cannot create _ weak reference because the current deployment

唐巧的iOS技术博客选摘

1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/ 2. 使用crashlytics来保存应用崩溃信息:http://blog.devtang.com/blog/2013/07/24/use-crashlytics/ 3. iOS开发工具篇,AppStore统计工具:http://blog.devtang.com/blog/2013/06/16/ios-dev-too

Objective C block背后的黑魔法

前言 block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用. "知其然而不知其所以然"是一件很痛苦的事情,那么block这套机制在OC中是如何实现的呢?本文通过从C/C++到汇编层面分析block的实现原理. Clang clang是XCode的编译器前端,编译器前端负责语法分析,语义分析,生成中间代码(intermediate representation ). 比如当你在XCode中进行build一个.m文件的时

初学Objective - C语法之代码块(block)

一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block的声明:返回值类型(^block变量名)(参数列表) 脱字符(^)是块的语法标记 二.block实现 block变量名 = ^返回值类型(参数列表) 1.  sayHi = ^{ NSLog(@"你好"); }; 2. operateOfValue = ^ NSInteger (NSInt

Objective-C( block的使用)

block block用来保存一段代码 block的标志:^ block跟函数很像:可以保存代码.有返回值.有形参.调用方式跟调用方法一样 block内部可以访问外面的变量 默认情况下,block内部不能修改外面的局部变量 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 利用typedef定义block类型 typedef int (^MyBlock)(int, int); 以后就可以利用MyBlock这种类型来定义block变量 MyBlock block; MyB

iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性与其他语言(C++)类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objectiv

iOS开发核心语言Objective C —— 全部知识点总结

本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发人员,想进一步提升者.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础.建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在開始Objective C语言的学习,假设您遇到问题也能够与我探讨.另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦.能够新浪微博私信?关注极客James,期待与您的共同学习和探讨! ! 由于时间有限,每