目录
block(即闭包,基于函数指针) 用于反向传递数据、复用一段代码
1、前一个页面创建block,后一个页面判断block非空后 调用block传入数据、block返回值接收数据。
2、在block中不能直接修改局部变量,需要__block修饰外边的变量。
3、默认存储在栈中,出了作用域则销毁。使用copy复制到堆中,需要手动释放。
4、当block作为属性内部又引用到该对象,会造成循环引用。__weak typeof(self) weakSelf=self; block内部使用weakSelf来避免循环引用。
动画、多线程GCD、回调、数组排序 都用到block:
[UIView animateWithDuration:3 animations:^{
}];
dispatch_async(dispatch_get_main_queue(),^{
});
- 声明(牢记)
@property (nonatomic,copy) void (^myBlock)(NSString *name);
.m使用
if(self.myBlock){
self.myBlock(@"");
}
简写
!self.myBlock?:self.myBlock(@"");
- 方法
// 把声明中的block名字放到外面 就是类型
-(void)setMyBlock:(void (^)(NSString *))myBlock{
}
-(void (^)(NSString *))getMyBlock{
}
- 调用方法
// ^(参数类型 参名){}
[self setMyBLock:^(NSString *name) {
// return 10; 又返回值时+
}];
myBlock(@"name");
- 局部变量
// 局部变量
void (^myBlock)(NSString *name)=^(NSString *name){
};
- 重定义(起别名)
typedef void (^MyBlock) (NSString *name);
MyBlock myBlock=^(NSString *name){
};
- block使用外部变量
int x=100; 局部变量时(方法内部)
int x=100;
void (^myBlock)()=^(){
NSLog(@"%d",x);
};
x=101;
myBlock(); // 返回100,旧值
__block int x=100; // 需要设置__block才能在block内部修改。
void (^myBlock)()=^(){
NSLog(@"%d",x);
};
x = 101;
myBlock(); // 返回101,最新值
int x=100; 全局变量时(方法外部)
int x=100;
void (^myBlock)()=^(){
NSLog(@"%d",x);
};
x=101;
myBlock(); // 返回101,新值
int x=100; // 全局变量时不用+__block就可以在内部修改
void (^myBlock)()=^(){
NSLog(@"%d",x);
x++;
};
myBlock(); // 返回101,最新值
static int x=100; 静态变量时
void (^myBlock)()=^(){
NSLog(@"%d",x);
};
x=101;
myBlock(); // 返回101,新值
void (^myBlock)()=^(){
NSLog(@"%d",x);
x++; // 静态变量时不用+__block就可以在内部修改
};
myBlock(); // 返回101,最新值
- 数组排序
[[NSArray new]sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
PersonM *personM=obj1;
PersonM *personM2=obj2;
if(personM.age>personM.age){
return NSOrderedDescending; // 在这里返回降序,obj1排在obj2的后
}
// NSOrderedAscending = -1L,
// NSOrderedSame,
// NSOrderedDescending
}];
网友评论