<commit_before>---
layout:     post
title:      编译器指令attribute
date:       2017-05-06
summary:    attribute是编译器为我们提供的一个指令，在编程过程中善用它能为我们带来意想不到的好处。
categories: objective-c attribute 
---

标签： objective-c attribute

--- 

## 前言

__attribute__其实是一个编译器指令，用于指定一些声明中特性包括函数声明和变量声明，这样一来可以编译器可以执行一些错误检查或是进行一些高级的优化。说的直白一点就是对声明加一点限制，拿函数而言，可以用__attribute__来限制形参不为空，这样一来，可以保证在编程的过程，函数调用形参一定是不为空的。这只是其中一个用法。这个指令对于编写框架以及更新框架用的多，在实际的编程中用的不多，下面列出的都是一些用法。

## 正文

对这个指令还比较陌生的程序员，那么在编程时候，肯定遇到过这样的情况：当调用一人API时，编译器发出警告说这个API在某某版本中已经被废弃，现在用某某API代替。这其实就是__attribute__的一种用法。

#### 用法

__attribute__后面是由两组圆括号，括号内的属性由逗号分割，该指令放在函数，变量和类型声明之后。

1.<font color="#FF6100" >__attribute__((cleanup(...)))</font>，用于修饰一个变量，在它的作用域结束时可以自动执行一个指定的方法，如：
```objc
// 指定一个cleanup方法，注意入参是所修饰变量的地址，类型要一样
// 对于指向objc对象的指针(id *)，如果不强制声明__strong默认是__autoreleasing，造成类型不匹配
static void stringCleanUp NSString *__strong *string) {
    NSLog(@"%@", *string);
}
// 在某个方法中：<commit_msg>attribute<commit_after>---
layout:     post
title:      编译器指令attribute
date:       2017-05-06
summary:    attribute是编译器为我们提供的一个指令，在编程过程中善用它能为我们带来意想不到的好处。
categories: objective-c attribute 
---

标签： objective-c attribute

--- 

## 前言

最近在看开源的框架的时候，经常能看到用__attribute__定义的各种宏。__attribute__是一个编译器指令，用于指定一些声明中特性包括函数声明和变量声明，这样一来可以编译器可以执行一些错误检查或是进行一些高级的优化。说的直白一点就是对声明加一点限制，拿函数而言，可以用__attribute__来限制形参不为空，这样一来，可以保证在编程的过程，函数调用形参一定是不为空的。这只是其中一个用法。这个指令对于编写框架以及更新框架用的多，在实际的编程中用的不多，下面列出的都是一些用法。

## 正文

对这个指令还比较陌生的程序员，那么在编程时候，肯定遇到过这样的情况：当调用一人API时，编译器发出警告说这个API在某某版本中已经被废弃，现在用某某API代替。这其实就是__attribute__的一种用法。

#### 用法

__attribute__后面是由两组圆括号，括号内的属性由逗号分割，该指令放在函数，变量和类型声明之后。

1.<font color="#FF6100" >__attribute__((cleanup(...)))</font>，用于修饰一个变量，在它的作用域结束时可以自动执行一个指定的方法，如：
```objc
// 指定一个cleanup方法，注意入参是所修饰变量的地址，类型要一样
// 对于指向objc对象的指针(id *)，如果不强制声明__strong默认是__autoreleasing，造成类型不匹配
static void stringCleanUp NSString *__strong *string) {
    NSLog(@"%@", *string);
}
// 在某个方法中：
{'fraction_non_alphanumeric': 0.11845584346906399, 'fraction_numerical': 0.013749338974087784, 'mean_word_length': 8.140096618357488, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3823713', 'n_tokens_mistral': 1282, 'n_tokens_neox': 1431, 'n_words': 73}