[object-c]像java一样优雅的写回调

本文通过一个Objective-C块的实例,展示了如何定义和使用块进行数据处理。具体包括了块作为字典值的设置方式及后续调用流程。

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

    void (^block)(NSString *cmd, NSDictionary *retDict) = ^(NSString *cmd, NSDictionary *retDict){
        NSLog(@"%@, %@", cmd, retDict);
    };
    int cmd = 3;
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:block, @"3", nil];
    
    void (^block2)(NSString *cmd, NSDictionary *retDict) = [dict valueForKey:@"3"];
    block2(@"100", [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"1", nil]);

### Java 中 List.get 方法引发的空指针异常解决方案 在 Java 编程中,`List.get(int index)` 方法用于获取列表指定索引处的元素。如果尝试访问的对象为 `null` 或者索引超出范围,则会抛出 `NullPointerException` 或 `IndexOutOfBoundsException`[^1]。 为了避免这种情况的发生,可以采取以下几种措施: #### 1. 预先检查对象是否为空 在调用 `get()` 方法之前,可以通过条件语句来验证 `List` 对象本身以及其内部元素是否存在。 ```java if (list != null && !list.isEmpty()) { Object element = list.get(index); System.out.println(element); } else { throw new NullPointerException("The list is either null or empty."); } ``` #### 2. 使用 Optional 类处理潜在的空值 自 Java 8 起引入了 `Optional<T>` 类型,它可以帮助开发者更优雅地管理可能返回 `null` 的情况。 ```java import java.util.Optional; public static void safeGet(List<?> list, int index) { if (list == null || index < 0 || index >= list.size()) { System.err.println("Invalid access"); return; } Optional<Object> optionalElement = Optional.ofNullable(list.get(index)); optionalElement.ifPresent(System.out::println); // Only prints non-null values. } ``` #### 3. 自定义封装类模拟 C++ 智能指针行为 类似于引用中的 C++ 实现方式[^2],可以在 Java 中创建一个持有资源并自动释放的工具类。尽管 Java 不支持像 C++ 那样的 RAII(Resource Acquisition Is Initialization),但通过结合 Lambda 表达式和接口回调机制可达到类似效果。 ```java @FunctionalInterface interface ResourceGuardAction<T> { T execute(); } class ResourceGuard<T> implements AutoCloseable { private final Supplier<T> resourceSupplier; private final Consumer<T> cleanupFunction; private T resource; public ResourceGuard(Supplier<T> supplier, Consumer<T> cleaner) { this.resourceSupplier = supplier; this.cleanupFunction = cleaner; } @Override public void close() throws Exception { if (resource != null && cleanupFunction != null) { cleanupFunction.accept(resource); } } public T getResource() { if (this.resource == null) { this.resource = resourceSupplier.get(); } return this.resource; } public static <T> T withResource(ResourceGuard<T> guard, ResourceGuardAction<T> action) { try (ResourceGuard<T> rg = guard) { return action.execute(); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } } // Example Usage: List<String> myList = Arrays.asList("A", "B", "C"); String result = ResourceGuard.withResource( () -> myList, lst -> lst.get(1) ); System.out.println(result); ``` 上述代码展示了如何利用函数式编程风格构建一种安全访问模式,在此过程中即使发生错误也能确保清理逻辑被执行。 #### 4. 原地修改算法降低空间复杂度 对于某些特定场景下的问题优化需求提到过常数级额外存储的要求[^3],这里提供了一个原地交换法作为例子说明如何减少内存消耗的同时规避越界风险: ```java private boolean isValidSwap(int[] nums, int i, int j){ return !(i<0||j>=nums.length||i>=nums.length||j<0); } public void swapElementsInPlaceIfValid(int[] array,int posOne ,int posTwo ){ if(isValidSwap(array,posOne,posTwo)){ int temp=array[posOne]; array[posOne]=array[posTwo]; array[posTwo]=temp; }else{ throw new ArrayIndexOutOfBoundsException("Position out of bounds!"); } } ``` 以上方法均能在不同程度上帮助解决因不当操作而导致的运行期崩溃现象。然而需要注意的是每种策略都有各自的适用场合,请依据实际业务背景选取最合适的方案实施改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值