首先__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__/
网友评论