iOS OC 实现 swift defer 效果

swift 中有个我很喜欢的用法:defer。效果是,当 defer 所在作用域将要结束时,系统会调用 defer 花括号里的内容。

比如,请求接口时需要展示 loading,接口完成或者某些条件不满足下要移除 loading,这时可能需要在多处调用移除 loading,一是可读性不强,二是很有可能会忘记调用移除 loading 代码。这时,defer 就派上用场了。

func requestData() {
	defer {
		hideLoading()
	}
	showLoading()
	...
	if xxx {
		return
	}
	...
}

OC里可以通过编译属性 __attribute__((cleanup)) 来实现。

// 函数参数是个 block
static void blockCleanUp(void(^*block)(void)) {
    (*block)();
}
// __attribute__((cleanup)) 修饰 block 变量,在 block 变量作用域结束时,调用函数 blockCleanUp,其参数为 = 后面的block
#define defer void(^block)(void) __attribute__((cleanup(blockCleanUp), unused)) = ^

使用:

- (void)test {
    NSLog(@"begin");
    defer {
        NSLog(@"defer1");
    };
    {defer {
        NSLog(@"defer2");
    };}
    NSLog(@"end");
}

打印内容:begin、defer2、end、defer1

sunnyxx 黑魔法__attribute__((cleanup))

你可能感兴趣的:(iOS,swift,ios,objective-c)