在Clang 3.7以前,Objective-C已經能夠使用相似@100、@YES、@10.5f等字面量表示一個NSNumber對象;用相似@"xxx"的字面量表示一個NSString對象;用@[]字面量表示一個NSArray對象;用@{}字面量表示一個NSDictionary對象;用@(expr)字面量根據expr的類型來表示其對應的上述類型的其中之一,此外還包括一個類型——NSValue。spa
在Clang3.7中引入了__attribute__((objc_boxable))屬性,若是咱們定義的某一結構體或聯合體用該屬性修飾,那麼此結構體或聯合體便可用@()方式封裝爲一個NSValue對象。下面咱們就來舉一個簡單的例子:code
struct __attribute__((objc_boxable)) StructA { int a; float f; }; // 這裏使用了C99中所引入的結構體複合字面量表達形式以及designated initializer NSValue *value = @((struct StructA){.a = 10, .f = 0.5f}); struct StructA sa; [value getValue:&sa]; NSLog(@"The value is: %.1f", sa.a + sa.f);
上述代碼中咱們看到,一個結構體對象經過@()被封裝爲了一個NSValue對象。而咱們能夠使用NSValue類中的getValue方法將其所封裝的結構體或聯合體的內容徹底返回出來。對象