block的定义,赋值

本文深入探讨了Objective-C中的Block概念,包括其定义、作用、语法格式、使用方式及注意事项,尤其关注如何避免循环引用问题,通过实例展示Block在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值