1.block声明
/*
这是一个名字为blockName的 block声明,
返回值类型为double,参数类型为int,参数名为num
block内容是 return num * 3.0;
*/
double (^blockName)(int) = ^(int num){
return num * 3.0;
};
2.block的typedef
2.1 typedef的使用
/*
声明一个名为myBlockType的代码块类型,
该类型的参数有两个,一个int类型,参数名为num,一个double类型,参数名为multi
该类型的返回值类型为double
*/
typedef double (^myBlockType)(int num,double multi);
2.2 声明block类型的使用
@interface GXBlockManager : NSObject
// 2.2.1声明myBlockType类型的实例变量
@property (nonatomic,copy)myBlockType myblock;
@end
@implementation GXBlockManager
- (void)testUseBlock
{
//2.2.2 block属性赋值
self.myblock = ^double(int num, double multi) {
return num * multi;
};
//2.2.3 block 调用
double testCount = self.myblock(3,4.0);
NSLog(@"testCount = %.f",testCount);
}
@end
3.block作为实例变量以及作为方法的参数类型
@interface GXBlockManager : NSObject
// block作为实例变量
// 声明参数是NSString 类型 返回值是BOOL类型 名字是isRightMIMEType 的block实例变量
@property(nonatomic,copy)BOOL(^isRightMIMEType)(NSString *MIMEType);
@end
@implementation GXBlockManager
// block作为方法的参数
//方法参数是一个 返回值时BOOL类型 block参数是NSString类型 block参数名是MIMEType 的block
-(void)registerIsRightMIMEType:(BOOL(^)(NSString * MIMEType))isRightMIMEType
{
self.isRightMIMEType = isRightMIMEType;
}
// block参数名可以省略
-(void)registerIsRightMIMEType2:(BOOL(^)(NSString *))isRightMIMEType
{
self.isRightMIMEType = isRightMIMEType;
}
//block的使用
-(BOOL)isIsRightMIMEType:(NSString *)MIMEType
{
if (self.isRightMIMEType) {
return self.isRightMIMEType(MIMEType);
}
return NO;
}
4.block作为参数时 可为空的标识添加
在 iOS 中,当你将 block 作为参数传入一个方法时,可以通过标记 __nullable 来表明这个 block 可以为 nil。以下是一个示例:
- (void)someMethodWithBlock:(void (^__nullable)(id))block {
// 在这里,你可以安全地检查 block 是否为 nil
if (block) {
block(someValue);
}
}
在这个示例中,block 参数被标记为 __nullable,这意味着你可以传递一个 nil 值给这个方法。然后,在方法体内,你可以通过检查 block 是否为 nil 来避免在 block 为 nil 时调用它,从而防止运行时错误。