您的位置:首页 > 其它

block的定义,赋值

2016-05-11 20:45 405 查看

block的定义

block属性或变量

格式:返回值类型(^block名称)(参数列表)


可以用strong修饰,也可以用copy修饰,苹果官方建议用copy

@property (nonatomic, strong) void(^myBlock)(); // 无参无返回值
@property (nonatomic, strong) void(^myBlock1)(NSString *); // 带参数
@property (nonatomic, strong) NSString *(^myBlock2)(NSString *); // 带参数与返回值
//定义变量
void(^myBlock)() = nil; // 无参无返回值
void(^myBlock1)(NSString *) = nil; // 带参数
NSString *(^myBlock2)(NSString *) = nil; // 带参数与返回值


block被当做方法的参数

格式:(block类型)参数名称
–》
(返回值类型(^)(参数列表)) 参数名称


- (void)test:(void(^)())testBlock//无惨无返回值
- (void)test1:(void(^)(NSString *))testBlock//带参数
- (void)test2:(NSString *(^)(NSString *))testBlock//带参数与返回值


使用typedef定义block

// 以后就可以使用myBlock定义无参无返回值的block
typedef void(^myBlock)();

// 使用myBlock1定义参数类型为NSString, 返回中为void的block
typedef void(^myBlock1)(NSString *);

//使用myBlock2定义参数类型为NSString,返回值也为NSString的block
typedef NSString *(^myBlock2)(NSString *);

//定义属性
@property (nonatomic, strong) myBlock testBlock;

//定义变量
myBlock testBlock = nil;

//当做参数
- (void)test:(myBlock)testBlock;


block的赋值

格式:block = ^返回值类型(参数列表){}

返回值类型为void时,void可以省略

有返回值时也可以省略返回值类型,开发中一般都省略返回值

没有参数,小括号也可以省略

// 没有参数没有返回值myBlock testBlock = ^void(){
NSLog(@"test");
};
//没有返回值,void可以省略
myBlock testBlock1 = ^(){
NSLog(@"test1");
};
//没有参数,小括号也可以省略
myBlock testBlock2 = ^{
NSLog(@"test2");
};
// 有参数没有返回值myBlock1 testBlock = ^void(NSString *str) {
NSLog(str);
}
// 省略void
myBlock1 testBlock = ^(NSString *str) {
NSLog(str);
}

// 有参数有返回值myBlock2 testBlock = ^NSString *(NSString *str) {
NSLog(str)
return @"hi";
}
//有返回值时也可以省略返回值类型
myBlock2 testBlock2 = ^(NSString *str) {
NSLog(str)
return @"hi";
}


解决block循环引用问题

block中的
self
,要换成
__weak typeof(self)


__weak typeof(self) selfVc = self;


__weak也可使用__unsafe_unretained,区别就是__weak修饰的指针,当对象销毁后,指针会被自动置为nil,而__unsafe_unretained修饰的指针,当对象销毁后会变成野指针,为了安全,推荐使用__weak
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: