iOS Block使用

原创 2015年07月08日 15:26:13


#import "ViewController.h"
/*
    使用Block最大的一个好处就是可以在代码块中随时访问外部变量
 
    比如你在A.class类中的某个方法中声明了一段代码块.你可以在代码块中直接对A.class所拥有的成员变量进行调用,并且,通过一定的条件(__block),还可以随时的修改这些变量的值和指针
    
    释放某个不再需要使用的Block成员变量,只需要将其设置nil即可
 
    为局部变量加上__block修饰,可以改变局部变量的值
 
    在Block里面可以随时访问全局变量,静态变量等,并对它们的值和指针进行修改.
 
    但在Block中直接使用所在声明区域的类的成员变量和self时也是可以直接使用和修改的,但需要注意循环引用.
 
 */
typedef BOOL (^block2)(void);

@interface ViewController ()
@property (strong, nonatomic) IBOutlet UIButton *block1;
- (IBAction)touchBlock1:(id)sender;
- (IBAction)touchBlock2:(id)sender;
- (IBAction)touchBlock3:(id)sender;

@property (nonatomic,copy) NSString *str2;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
#pragma mark -block用法1
- (IBAction)touchBlock1:(id)sender {
    // void是代码块的返回值,int是代码块的参数
    void (^MyBlock1)(int i)=^(int i){
        NSLog(@"block===1====%d",i);
    };
    //给block代码块传入int类型的参数10
    MyBlock1(10);
}
#pragma mark -block用法2 在Block里面可以随时访问全局变量,静态变量等,并对它们的值和指针进行修改.
- (IBAction)touchBlock2:(id)sender {
    /*
     首先,在block之前定义对self的一个弱引用wSelf,因为是弱引用,所以当self被释放时wSlelf会变为nil,然后在block中引用该弱引用,考虑到多线程情况,通过使用强引用sself来引用该弱引用,这时如果 self 不为 nil 就会 retain self,以防止在后面的使用过程中 self 被释放;然后在之后的 block 块中使用该强引用 sself,注意在使用前要对 sself 进行了 nil 检测,因为多线程环境下在用弱引用 wself 对强引用 sself 赋值时,弱引用 wself 可能已经为 nil 了。
     通过这种手法,block 就不会持有 self 的引用,从而打破了循环引用。
     */
    //防止循环引用
    __weak ViewController *wSelf = self;
    //__weak typeof(self) weakSelf = self;
    void (^changeValue)(NSString *)=^(NSString *str){
        wSelf.str2=str;
        ViewController * sself = wSelf;
        if (sself) {
            NSLog(@"%@", sself);
        }else {
            NSLog(@"<self> dealloc before we could run this code.");
        }
    };
    //给block代码块传入参数
    changeValue(@"block2");
    NSLog(@"self.str2:%@",self.str2);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS --- 关于block的常见使用方法

Objective-C中的block有多种定义和使用方法.
  • icetime17
  • icetime17
  • 2015年10月07日 11:30
  • 5152

iOS用copy修饰Block

Block的三个类型: 1._NSConcreteGlobalBlock,全局的静态block,不会访问外部的变量。就是说如果你的block没有调用其他的外部变量,那你的block类型就是这...
  • hncsy403
  • hncsy403
  • 2016年12月12日 14:57
  • 832

iOS Block的基本使用以及Block传值

block为我们提供了一个非常便捷的方法去实现各种传值以及回调 合理的使用block可以减少代码量以及更加优雅的实现功能 现做个小整理如下: #pragma mark About Block ...
  • Scott_cc
  • Scott_cc
  • 2016年04月14日 15:52
  • 3482

iOS Block与self的那点事

记得刚接触循环引用的时候经常写这种逗比代码 __weak UIViewController *weakSelf = self; 后来看开源库源码的时候发现了一种比较好的写法 _...
  • capf_Sam
  • capf_Sam
  • 2017年03月09日 15:47
  • 1306

IOS block 块实现简单的页面跳转传值

/////////// ////////FirstViewController - (void)viewDidLoad {     [super viewDidLoad]; ...
  • liqiang052
  • liqiang052
  • 2014年05月13日 17:45
  • 867

IOS中 Block用法进阶二 局部变量和全局变量在Block中的使用

一、局部变量与block块 先看下面代码: int number=100; void (^TestBlock)(int)=^(int x){ number=number+x; }; TestBlock...
  • zm_yh
  • zm_yh
  • 2016年05月21日 11:36
  • 8223

iOS-Block总结 && 全面解析逆向传值

1、block的特点:      block是C语言;      block是一种数据类型、可以当做参数,也可以用做返回值;——总之,对比int的用法用即可(当然,定义的时候,最好跟函数对比); ...
  • yang198907
  • yang198907
  • 2015年12月06日 22:59
  • 2910

iOS Block 和 Delegate 的使用比较

1.共同的作用: Block 和 Delegate中的方法都可以理解成回调函数,当某件事情发生的时候取执行一段代码片段 2.Block 优点:是一种轻量级的回调,能够直接访问上下文,使用块的地方和块的...
  • vbirdbest
  • vbirdbest
  • 2016年07月11日 11:12
  • 2005

iOS 学会使用delegate和block<一>

毕业将近半年了,从事iOS开发也一年多了,入了iOS这个行列,算是一个明智之举吧,iOS开发带给我了很多欢乐,当然了,也给了我物质上很大的满足,今天我来给说一下自己对delegate和block的理解...
  • baidu_31683691
  • baidu_31683691
  • 2015年12月22日 12:32
  • 2965

iOS进阶面试题----Block部分

1 什么是block 对于闭包(block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解。对于刚接触Block的同学,会觉得有些绕,因为我们习惯写这样的程序m...
  • xunyn
  • xunyn
  • 2013年09月17日 11:00
  • 67989
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS Block使用
举报原因:
原因补充:

(最多只允许输入30个字)