您的位置:首页 > 其它

多线程:block 演练

2016-03-25 23:20 260 查看
//
//  ViewController.m
//  04-block演练
//
//  Created by gzxzmac on 16/1/29.
//  Copyright © 2016年 gzxzmac. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, copy) void(^myBlock)(); // 使用属性保存block
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//    [self blockDemo5];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self blockDemo5];
self.myBlock();
NSLog(@"%@",self.myBlock);
}

// 在MRC的时候,使用copy 把 block 从栈区复制到堆区
// 在ARC下,使用copy 和 strong 都可以。因为ARC使用局部变量之后,本来就是在堆区上面,只要强引用它就可以了
// block 做属性的时候,用什么来修饰? copy
- (void)blockDemo5 {

int i = 10;
self.myBlock = ^ {
NSLog(@"my block %d",i);
};
}

- (void)blockDemo4 {
int i = 10;
void (^block) () = ^ {
NSLog(@"hello %d",i);
};

/*
-- 仅限于ARC
1. 如果没有使用外部变量,block存在全局区/静态区(不分ARC和MRC)
2. 如果使用了外部变量,block存在堆区
-- MRC
1. 如果使用了外部变量,block 存在栈区
*/
// 查看block 内存地址 ,打印block 内存地址,直接 %@
NSLog(@"%@",block);
}

// 如何在block 里面修改变量的值 ==> 添加 __block
- (void)blockDemo3 {
// i 的作用范围 :布局变量,栈区
// 如果想在block 里面使用变量,要使用__block
__block int i = 10; // 栈区
NSLog(@"block 之前 i ==> %p",&i);
NSMutableArray *data = [NSMutableArray array];
void (^block) () = ^ {
// block 把 i 的值复制过来
i = 20;
// 往数组添加元素,是否需要添加__block
[data addObject:@"hello"];
NSLog(@"i = %d",i);
NSLog(@"block i ==> %p",&i);
//        NSLog(@"i = 10");
};
//    i = 20;
block ();
NSLog(@"%@",data);
NSLog(@"block 之后 i ==> %p",&i);

}

// 面试题: 打印多少
- (void)blockDemo2 {
// i 的作用范围 :布局变量,栈区
int i = 10; // 栈区
void (^block) () = ^ {
// block 把 i 的值复制过来
NSLog(@"i = %d",i);
//        NSLog(@"i = 10");
};
i = 20;
block ();

}

- (void)blockDemo1 {// 1
// i 的作用范围 :布局变量,栈区
int i = 10; // 栈区
void (^block) () = ^ {
// block 把 i 的值复制过来
NSLog(@"i = %d",i);
};
// 如果单独定义了block 使用这种方式
[self callback:block];

// 如果没有单独定义block 就用这种方式
[self callback:^{

}];

}

- (void)callback:(void(^)())block {// 2

block();
}

- (void)blockDemo0 {
// block 必须会手写
// 可以借助inlineBlock 来完成block 的编写,但是不要依赖
int (^blockName)(int) = ^(int index) {
NSLog(@"index : %d",index);
return index + 1;
};

int result = blockName(10);
NSLog(@"%d",result);
//    int a = 10;
//^ () {} 如果没有参数的情况下,小括号可以省略
// 匿名函数
void (^blockDemo)() = ^ {
NSLog(@"blockDemo");
};
blockDemo();
}

// C语言函数
void demo (int a) {
// a
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: