1. 程式人生 > >Objective-C中,類方法的getter和setter可以用點運算符嗎?

Objective-C中,類方法的getter和setter可以用點運算符嗎?

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可以用點運算符嗎?