OC可能你常常會看到@(100)等用法。不用奇怪,就是這個Function attributes
使用示例:segmentfault
struct __attribute__((objc_boxable)) some_struct { int i; }; union __attribute__((objc_boxable)) some_union { int i; float f; }; typedef struct __attribute__((objc_boxable)) _some_struct some_struct; some_struct ss; NSValue *boxed = @(ss);
不少OC的class容許子類重載父類方法,但須要在重載的方法中調用父類方法。如:-[UIViewController viewDidLoad]
,-[UITableViewCell prepareForReuse]
等。 對於這樣的狀況,objc_requires_super
就能派上用場。在父類的方法聲明時使用該屬性,可以使子類重載方法時必須調用父類方法。函數
- (void)foo __attribute__((objc_requires_super));
Foundation framework
已經定義好了一個宏NS_REQUIRES_SUPER
讓開發者使用這個屬性:ui
- (void)foo NS_REQUIRES_SUPER;
使C下的方法調用相似C++中的overload:atom
float __attribute__((overloadable)) tgsin(float x) { return sinf(x); } double __attribute__((overloadable)) tgsin(double x) { return sin(x); } long double __attribute__((overloadable)) tgsin(long double x) { return sinl(x); }
調用tgsin
時會根據參數x
類型決定調用對應的方法。具體參見C++99標準。不在此贅述。code
改變Class或者Protocol的運行時名稱。
(水平有限,暫時不知道有何方便之處)對象
__attribute__((objc_runtime_name("MyLocalName"))) @interface Message @end
先來看一段代碼:ip
@interface MyObject: NSObject @property (nonatomic) newValue; @end
編譯出現error以下:Property follows Cocoa naming convention for returning 'owned' objects
Explicitly declare getter '-newValue' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object
內存
在支持ARC後,clang有一些對於內存管理的命名規範。ci
You take ownership of an object if you create it using a method whose name begins with 「alloc」, 「new」, 「copy」, or 「mutableCopy」開發
因此,若是方法名以alloc
, new
, copy
, mutableCopy
開頭的函數都會被做爲生成新對象的函數對返回對象retainCount
自增1.
解決辦法爲,在property後加入 __attribute__((objc_method_family(none)))
其餘用法:
__attribute__((objc_method_family(X)))
X能夠是none
, alloc
, copy
, init
, mutableCopy
, new
其中之一。放在property或者函數後面。
固然你也能夠使不知足編譯器命名規則的方法成爲生成新對象的方法,如:
- (id) createObject __attribute__((objc_method_family(new)));
下期會介紹剩下的和一些有用的宏
原做寫於segmentfault 連接