美文网首页
OC中的 __attribute__中关于__attribute

OC中的 __attribute__中关于__attribute

作者: taosiyu | 来源:发表于2016-09-08 13:24 被阅读56次

    首先__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__/

    相关文章

      网友评论

          本文标题:OC中的 __attribute__中关于__attribute

          本文链接:https://www.haomeiwen.com/subject/heysettx.html