美文网首页
Objective-C Block(1)使用

Objective-C Block(1)使用

作者: WorldPeace_hp | 来源:发表于2017-12-19 17:43 被阅读0次
概述:
  • 作为参数使用
  • 方法内部使用
  • 全局声明使用
  • 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);
}

相关文章

网友评论

      本文标题:Objective-C Block(1)使用

      本文链接:https://www.haomeiwen.com/subject/mhebwxtx.html