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 void(^myBlock)();
typedef void(^myBlock1)(NSString *);
typedef NSString *(^myBlock2)(NSString *);
@property (nonatomic, strong) myBlock testBlock;
myBlock testBlock = nil;
- (void)test:(myBlock)testBlock;
block的赋值
- 格式:block = ^返回值类型(参数列表){}
- 返回值类型为void时,void可以省略
- 有返回值时也可以省略返回值类型,开发中一般都省略返回值
- 没有参数,小括号也可以省略
NSLog(@"test");
};
myBlock testBlock1 = ^(){
NSLog(@"test1");
};
myBlock testBlock2 = ^{
NSLog(@"test2");
};
NSLog(str);
}
myBlock1 testBlock = ^(NSString *str) {
NSLog(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