2010-12-20 101 views
13

我見過這個操作符在「學習Objective-C在Mac上」的示例代碼中彈出了好幾遍。目標C中的「 - >」是什麼?

我相信它是Objective C繼承的C語言的操作符。 我試着谷歌搜索堆棧溢出和奇怪的沒有出現。

它有英文名嗎?

回答

10

它與結構有關。

當我們在棧上本地有一個結構體時,我們使用.運算符訪問它的成員。例如:

CGPoint p = CGPointMake(42,42); 
NSLog(@"%f", p.x); 

然而,如果我們替代地具有指針到的結構中,我們必須使用->操作符:

CGPoint *p = malloc(1*sizeof(CGPoint)); 
p->x = 42.0f; 
NSLog(@"%f", p->x); 
free(p); 
+4

我們不需要,我們可以使用'(* p).x'代替。 – jer 2010-12-20 01:13:17

+1

@jer肯定,但我認爲'p-> x'比'(* p).x'更容易閱讀。 – 2010-12-20 04:43:49

5

這是一個部件選擇(或訪問)相當於一個指針去參考(如在評論中指出)

a->member等同於C/C++

+0

作爲上述的必然結果,它與C中的一樣。 – jer 2010-12-20 00:47:57

+0

我認爲downvote是因爲你說它是一個指針去引用,而實際上指針去引用運算符是通常的'*' ; C99標準將它稱爲「成員訪問操作符」,即點('.')(第6.6.9節)。我只是說這是'(* a).Member'記號的簡寫。 – 2010-12-20 00:50:07

+0

+1,因爲它是正確的。 – 2010-12-20 00:50:14

10

->(*a).member特定於Objective-C的。這是一個C運營商。

現在已清除,它是成員訪問操作符,相當於指針解引用,然後對結果使用點運算符。

假設您有一個struct這樣的:

typedef struct Person { 
    char *name; 
} Person; 

Person *jacob = malloc(1*sizeof(Person)); 

所以這樣的說法:

jacob->name = "Jacob"; 

等效於此聲明:

(*jacob).name = "Jacob"; 

當然,不要忘了free

free(jacob); 
+0

當你說它相當於*時,它並不是真的。這相當於取消引用然後訪問使用。 – 2010-12-20 00:51:38

+0

@米奇,不,我其實就是這個意思。 – 2010-12-20 00:53:11

+0

也許創建一個Person結構,然後賦值,以獲得完整的正確性。 – 2010-12-20 00:54:45

2

a->b相當於(*a).b,並且指定的構件ba指向的對象。

在C標準中,它被稱爲「結構/聯合指針操作符」,它不是真正的最後名稱。

9

在C

a->b 

(*a).b 

快捷這對於指向一個結構的成員的解引用。

這很有用,因爲。綁定比解引用操作符*強。所以通過使用 - >避免使用這些醜陋的括號。

2

這是「間接成員訪問運營商」。它是一個C運算符,Objective-C和C++都繼承了它。

a->b 

等同於:

(*a).b 

,但打字少。 (由於優先級爲*.,擴展表單中需要父元素。)

2

這是所有人都說過的,它是訪問結構指針成員的快捷方式,但只是添加一個說明,您可以訪問ivars使用相同的語法由於Objective-C的運行時的工作方式:

@interface Foo : NSObject { 
    NSString *something; 
} 

/* ... SNIP ... */ 

NSLog(@"something = %@", foo->something); // Where foo is an instance of the Foo class 

這是非常方便,當你需要訪問不是由方法暴露的ivars;特別是當您需要在您的對象上實現copyWithZone:時。

+0

多數民衆贊成在確定,但你能告訴我這是什麼意思。 loginViewController-> mPortSIPSDK = mPortSIPSDK; 第一個mportSIPSDK是在loginviewcontroller中聲明的PORTSIPSDK的實例。第二個是ie(= mPortSIPSDK)在aoodelegate中聲明。 – 2013-12-09 06:20:29

4

The same thing that it means in C。它可以用來直接訪問對象的實例變量,但通常這不是最佳實踐。你所指的點符號是property,而不是通常的C點符號。

+2

可能有趣的是,'self-> bla'(或普通的'bla')直接訪問伊娃,而'self.bla'通過屬性訪問器訪問伊娃。 – 2011-08-20 07:30:08

+0

是的,這是我的答案中隱含的。尤其是,您不能使用'self.bla'來訪問實例變量,因爲'self'是指向內存中對象的指針。這就是爲什麼你必須使用' - >'。這就是爲什麼C點符號和Obj-C屬性之間沒有衝突的原因:) – jtbandes 2011-08-20 07:31:55

+0

jtbandes:的確如此。 – 2011-08-20 07:45:19