先看一下 NSArray 是怎么传递 block 参数的

使用Objective-C在方法结束时调用Block
本文介绍如何在Objective-C中使用Block在特定方法执行完毕后自动调用另一方法,通过实例展示了实现过程及应用场景。

转载自:http://www.cnblogs.com/ihojin/p/block_params.html

先看一下 NSArray 是怎么传递 block 参数的


...
@interface NSArray (NSExtendedArray)


#if NS_BLOCKS_AVAILABLE
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);


@end


对于不需要参数的情况,比如只是想在某个方法结束后调用另一方法


//实现
- (void)endInput:(void (^)())completion
{
    [UIView animateWithDuration:0.25 animations:^{

    } completion:^(BOOL finished) {

        if (completion) {
            completion();
        }
    }];
}

//调用
[instance endInput:^{
    //做点什么
}];

### Block 块的定义与用法 在编程中,块(Block)是一种语言级别的特性,最初被添加到 C、Objective-C 和 C++ 中。块可以被视为一种代码片段,这种片段不仅可以像普通函数那样执行,还可以作为值传递给方法或函数[^3]。块的核心特性包括以下几点: - **代码封装**:块允许将一段代码封装起来,并作为一个整体进行操作。这意味着块可以像其他数据类型一样被传递和存储。 - **捕获上下文**:块能够捕获其定义时所在的上下文中的变量值。这种能力使得块类似于其他语言中的闭包(Closure)或 lambda 表达式[^3]。 #### Block 的语法 在 Objective-C 中,块的定义方式如下: ```objective-c returnType (^blockName)(parameterTypes) = ^(parameters) { // Block 内部代码 }; ``` 例如,一个简单的块定义可能如下所示: ```objective-c int (^simpleBlock)(void) = ^{ return 42; }; ``` 在此示例中,`simpleBlock` 是一个没有参数且返回整数值 42 的块[^3]。 #### Block 的用法 块的常见用法包括但不限于以下几种场景: 1. **作为参数传递** 块可以作为参数传递给方法或函数,从而实现回调功能。例如,在异步任务完成后调用块以处理结果: ```objective-c void performTaskWithCompletion(^(void) completion) { // 执行任务 if (completion) { completion(); } } [self performTaskWithCompletion:^{ NSLog(@"Task completed!"); }]; ``` 2. **存储在变量中** 块可以存储在变量中,以便稍后调用。这使得块可以像普通对象一样被管理: ```objective-c void (^logMessage)(NSString *) = ^(NSString *message) { NSLog(@"%@", message); }; logMessage(@"Hello, World!"); ``` 3. **捕获外部变量** 块可以捕获其定义时所在的上下文中的变量。需要注意的是,块默认对变量的捕获是只读的。如果需要修改捕获的变量,则需要使用 `__block` 修饰符: ```objective-c __block int counter = 0; void (^incrementCounter)(void) = ^{ counter++; }; incrementCounter(); NSLog(@"Counter: %d", counter); // 输出 1 ``` #### Block 与 Lambda 的区别 尽管块与 lambda 表达式在某些方面相似,但它们之间存在一些关键差异。例如,块是 Objective-C 对象,因此可以被添加到集合类(如 `NSArray` 或 `NSDictionary`)中[^3]。此外,块的语法和行为可能会因宿主语言的不同而有所变化。 ### 注意事项 在使用块时需要注意以下几点: - **内存管理**:块会捕获其上下文中的变量,可能导致循环引用问题。开发者需要确保正确释放资源,避免内存泄漏。 - **线程安全**:如果块在多线程环境中使用,需要特别注意线程安全问题,尤其是在访问共享资源时。 - **性能开销**:虽然块提供了强大的功能,但在频繁创建和销毁块时可能会带来一定的性能开销。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值