OC中的 __attribute__中关于__attribute__((cleanup))的研究

1,161 阅读2分钟

首先__attribute__用于向编译器描述特殊的标识、检查或优化的,等等

而__attribute__((cleanup(...)))是其中的一中用法,为什么介绍这个呢?因为这函数很有趣。。。。。


__attribute__((cleanup(...)))是用于修饰一个变量,在它的作用域结束时可以自动执行一个指定的方法,如:

// 指定一个cleanup方法,注意入参是所修饰变量的地址,类型要一样

// 对于指向objc对象的指针(id *),如果不强制声明__strong默认是__autoreleasing,造成类型不匹配

static void stringFun(__strong NSString **string) {

NSLog(@"%@", *string);

}

// 在某个方法中:

{

__strong NSString *string __attribute__((cleanup(stringFun))) = @"sunnyxx";

} // 当运行到这个作用域结束时,自动调用stringFun

而所谓的作用域结束说白了就是:大括号结束、return、goto、break、exception等各种情况

当然__attribute__((cleanup(...)))也能修饰其他的一些变量,如:一些基本类型,还有class,甚至是block

所以就可以这么写了

- (void)viewDidLoad {

[super viewDidLoad];

[self test];

}

static void stringCleanUp(__strong NSString **string) {

NSLog(@"%@", *string);

}

static void blockCleanUp(__strong void(^*block)(void)) {

(*block)();

}

-(void)test{

NSLog(@"测试的行哈哈哈哈==1====1====1==1====1====1===");

__strong NSString *string __attribute__((cleanup(stringCleanUp))) = @"sunnyxx";

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"测试的行哈哈哈哈==3===3=====3======3==3===3==");

});

__strong void(^block)(void) __attribute__((cleanup(blockCleanUp), unused)) = ^{

NSLog(@"I'm dying...");

};

NSLog(@"测试的行哈哈哈哈==2===2=====2======2==2===2==");

}

以下是xcode的执行结果

//2016-09-08 09:36:00.148 Aiyep[844:280540] ====yes

//2016-09-08 09:36:00.364 Aiyep[844:280540] 测试的行哈哈哈哈==1====1====1==1====1====1===

//2016-09-08 09:36:00.364 Aiyep[844:280540] 测试的行哈哈哈哈==2===2=====2======2==2===2==

//2016-09-08 09:36:00.364 Aiyep[844:280540] I'm dying...

//2016-09-08 09:36:00.364 Aiyep[844:280540] sunnyxx

//2016-09-08 09:36:00.517 Aiyep[844:280540] 测试的行哈哈哈哈==3===3=====3======3==3===3==

有兴趣的可以继续研究,本人也只是初探初探

http://blog.sunnyxx.com/2014/09/15/objc-attribute-cleanup/


http://nshipster.com/__attribute__/