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使用总结

  • 2015年10月27日 15:59
  • 32KB
  • 下载

IOS Block的使用

  • 2014年05月11日 01:04
  • 33KB
  • 下载

iOS简单封装网络请求,使用block回掉函数方式

// 002 //  RequestHttpClass.h 003 //  封装简单的异步请求 ...

iOS block基础使用

  • 2013年07月18日 15:06
  • 49KB
  • 下载

IOS UIControl使用block作为事件捕获回调

对于继承自UIControl的target-action模式,需要使用如下方式进行事件捕获- (void)addTarget:(nullable id)target action:(SEL)actio...
  • jncpp
  • jncpp
  • 2016年01月07日 23:36
  • 889

iOS进阶----block的使用

iOS进阶之block的介绍和使用

如何在iOS中使用 block

Block可以帮助我们组织独立的代码段,并提高复用性和可读性。iOS4在UIKit中引入了该特征。超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识。 Blo...

iOS 中Block的使用场景

block在开发中的使用场景(保存代码)//定义类型 //BlockType:类型别名 //typedef void(^BlockType)();//---1111--- //说明:2个---111-...

ios block初级使用

block和GCD是ios高级程序员面试必问的问题,ben'pi
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS Block使用
举报原因:
原因补充:

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