概述
[block]:代码块,闭包;代码块是对一段代码的封装,代码块可以作为一个变量使用,类似于函数指针变量,可以作为函数的参数来进行传递,也可以直接在代码中匿名实现.
block的定义和实现类似函数的声明和实现。
#pragma mark - 1
//block的内部可以读取外部的局部变量,但是不能修改,要修改需要加上__block声明
int c = 2 ;
__block int c2 = 1 ;//block可以修改的局部变量,不适用___block是无法修改c的(不加,在block内部是只读的)
int (^myBlocks)(int ,int); //声明一个block 在下面进行实现
myBlocks = ^(int m ,int n){
NSLog(@"%i %i",m,n);
return m*n;
};//把block看成一个变量
//调用block
int r = myBlocks(7,8);
NSLog(@"——————————————%i",r);
#pragma mark - 定义一个空的 block
//block是一个数据类型
//定义一个名字为block的变量 相当于 void(^)(void) block ;
void(^block)(void);
//block可以保存一个代码块
//返回类型为void的代码块,返回类型体现在代码块的return上
block = ^(void){
NSLog(@"hello");
};
NSLog(@"____________________");
block();
NSLog(@"____________________");
#pragma mark -定义了一个返回值为int,有两个参数的block变量
int (^block2)(int ,int);
block2 = ^(int a, int b){
return a+b;
};
NSLog(@"%d",block2(8,9));
//打印说明block'是一个对象,也需要遵循内存管理,对于block来说,我们要进行copy)
NSLog(@"%@",block2);
int (^block3)(int,int) = [block2 copy];
NSLog(@"%@",block3);
// [block3 release];
// 也可以用系统提供的宏进行拷贝
// int (^block4)(int ,int) = Block_copy(block2);
__block NSString *str = @"hello";
NSString *str1 = @"world";
NSString *(^block5)(NSString *,NSString *);
block5 = ^(NSString *s ,NSString *r){
//注意,只能读取不能修改 ,如果想要修改,要用__block声明
str = @"bsbbbsb";
NSLog(@"str = %@",str);
NSLog(@"str1 = %@",str1);
return [s stringByAppendingString:r];
};
NSLog(@"%@",block5(str,@"_1hello"));
NSLog(@"str = %@",str);
#pragma mark - dog类
Dog *dog = [[Dog alloc]init];
dog.dogBlock = ^(int count){
for (int i = 0; i < count; i++) {
NSLog(@"旺旺");
}
};
[dog closeDoor];
[dog dogEat:5 complation:^(int num) {
NSLog(@"哈哈哈 num = %d",num);
}];
#import <Foundation/Foundation.h>
//定义了一个block类型 ,,名字为dogBark,返回类型为void有一个int类型的参数的block
typedef void(^DogBlock)(int num) ;
@interface Dog : NSObject
@property(nonatomic,copy) DogBlock dogBlock;
- (void)closeDoor ;
- (void)dogEat:(int)num complation:(DogBlock)dogBk;
@end
#import "Dog.h"
@implementation Dog
- (void)closeDoor{
if (_dogBlock) {
_dogBlock(arc4random()%10+1);
}
}
- (void)dogEat:(int)num complation:(DogBlock)dogBk{
//传入参数
NSLog(@"....dog 吃完了 %d 个 食物",num);
if (dogBk) {
dogBk(1000);
}
}
@end
最后
以上就是欣慰鞋垫为你收集整理的block的基本用法的全部内容,希望文章能够帮你解决block的基本用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复