Playing with __attributes__ (二)

objc_boxable

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);

objc_requires_super

不少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;

overloadable

使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

objc_runtime_name

改變Class或者Protocol的運行時名稱。
(水平有限,暫時不知道有何方便之處)對象

__attribute__((objc_runtime_name("MyLocalName")))
@interface Message
@end

objc_method_family

先來看一段代碼: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 連接

相關文章
相關標籤/搜索