概述:
- 作为参数使用
- 方法内部使用
- 全局声明使用
- Block操作外部变量
作为参数使用
- (void)test:(NSString *)string completion:(void(^)(NSArray *array))completion {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSArray *components = [string componentsSeparatedByString:@"/"];
NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:components.count];
for (NSString *component in components) {
[component stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
[mutableArray addObject:component];
}
dispatch_async(dispatch_get_main_queue(), ^{
completion(mutableArray);
});
});
}
方法内部使用
- (void)test:(NSString *)string {
int(^testNumberBlock)(NSString *string) = ^(NSString *string) {
return (int)string.length;
};
void(^testStringBlock)(NSString *string) = ^(NSString *string) {
[string stringByReplacingOccurrencesOfString:@"%" withString:@""];
[string stringByReplacingOccurrencesOfString:@"-" withString:@""];
[string stringByReplacingOccurrencesOfString:@";" withString:@""];
[string stringByReplacingOccurrencesOfString:@"!" withString:@""];
};
NSInteger totalLength = 0;
NSArray *values = [NSArray arrayWithObjects:@"abfg%higk",@"cdefg-higk",@"abcdef%;",@"!!%", nil];
for (NSString *value in values) {
testStringBlock(value);
totalLength += testNumberBlock(value);
}
NSLog(@"totalLength = %d",(int)totalLength);
}
全局声明使用
typedef void(^PublicBlock)(int number, NSString * _Nullable string);
@interface xBlockManager:NSObject
@property (nonnull,copy) PublicBlock publicBlock;
@property (nonatomic,copy) void(^handler)();
@end
@implementation xBlockManager
- (void)setTestBlock:(PublicBlock)block {
self.publicBlock = block;
}
@end
-----------------------------------------------------
@interface TestClass:NSObject
@end
@implementation TestClass
- (instancetype)init {
self = [super init];
if (self) {
xBlockManager *blockManager = [[xBlockManager alloc] init];
blockManager.publicBlock = ^ (int number,NSString *string) {
NSLog(@"%d,%@",number,string);
};
}
return self;
}
@end
Block操作外部变量
block内需要处理外部变量时需要增加__block。
作用:
1.否则不能在block内对变量操作。
2.避免被强引用。
- (void)testBlock {
int number = 0;
__block int blockNumber = 0;
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"1", nil];
__block NSMutableArray *blockMutableArray = [NSMutableArray arrayWithObjects:@"1", nil];
NSLog(@"mutableArray = %@:%ld",mutableArray,CFGetRetainCount((__bridge CFTypeRef)(mutableArray)));//retainCount=2
NSLog(@"blockMutableArray = %@:%ld",blockMutableArray,CFGetRetainCount((__bridge CFTypeRef)(blockMutableArray)));//retainCount=2
void (^block)() = ^() {
number = 1;//编译错误
blockNumber = 2;//这个可以
NSLog(@"mutableArray = %@:%ld",mutableArray,CFGetRetainCount((__bridge CFTypeRef)(mutableArray)));//retainCount=4
NSLog(@"blockMutableArray = %@:%ld",blockMutableArray,CFGetRetainCount((__bridge CFTypeRef)(blockMutableArray)));//retainCount=2
};
block();
NSLog(@"mutableArray = %@:%ld",mutableArray,CFGetRetainCount((__bridge CFTypeRef)(mutableArray)));//retainCount=4
NSLog(@"blockMutableArray = %@:%ld",blockMutableArray,CFGetRetainCount((__bridge CFTypeRef)(blockMutableArray)));//retainCount=2
NSLog(@"number = %d, blockNumber = %d",number,blockNumber);
}
网友评论