Objective-C中,類方法的getter和setter可以用點運算符嗎?
阿新 • • 發佈:2018-09-16
clang col 靜態變量 變量 uri family lan getc sta
Objective-C中,對象實例property的getter和setter可以使用點運算符來操作,那麽類方法的getter和setter可以使用點運算嗎?
答案是肯定的。
看如下代碼:
#import <Foundation/Foundation.h> static int i = 0; @interface X : NSObject + (int)i; + (void)setI:(int)ii; @end @implementation X + (int)i { return i; } + (void)setI:(int)ii { i = ii; }@end int main() { X.i; X.i= 1; }
類X有對靜態變量i操作的getter和setter類方法,使用clang -rewrite-objc命令將代碼重寫為c++查看:
int main() { ((int (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("X"), sel_registerName("i")); ((void (*)(id, SEL, int))(void *)objc_msgSend)((id)objc_getClass("X"), sel_registerName("setI:"), 1); }
通過代碼可以發現,main函數裏面對靜態setter和getter方法的調用,最終也是轉換成了objc_msgSend的調用;並且對i進行設值得方法,最終轉換成了調用setI方法。
Objective-C中,類方法的getter和setter可以用點運算符嗎?