簡體   English   中英

'->'(箭頭運算符)和'.'有什么區別? (點運算符)在 Objective-C 中?

[英]What is the difference between '->' (arrow operator) and '.' (dot operator) in Objective-C?

在 Objective-C 中,使用-> (箭頭運算符)和訪問 class 中的變量有什么區別. (點運算符)? ->用於直接訪問 vs 點( . )不是直接的嗎?

->是傳統的 C 運算符,用於訪問指針引用的結構的成員。 由於 Objective-C 對象(通常)用作指針和 Objective-C class 是一個結構,您可以使用->訪問其成員,這(通常)對應於實例變量請注意,如果您嘗試從 class 外部訪問實例變量,則必須將實例變量標記為公共。

因此,例如:

SomeClass *obj = …;
NSLog(@"name = %@", obj->name);
obj->name = @"Jim";

訪問在SomeClass (或其超類之一)中聲明的實例變量name ,對應於 object obj

另一方面, . (通常)用作 getter 和 setter方法點語法 例如:

SomeClass *obj = …;
NSLog(@"name = %@", obj.name);

等效於使用 getter 方法name

SomeClass *obj = …;
NSLog(@"name = %@", [obj name]);

如果name是已聲明的屬性,則可以為其 getter 方法指定另一個名稱。

點語法也用於 setter 方法。 例如:

SomeClass *obj = …;
obj.name = @"Jim";

相當於:

SomeClass *obj = …;
[obj setName:@"Jim"];

箭頭->是點與指針解引用結合的簡寫,這兩個對於某些指針p是相同的:

p->m
(*p).m

箭頭符號是從 C 和 C 繼承的,因為結構成員訪問運算符 ( . ) 綁定比指針解引用運算符 ( * ) 更松散,沒有人想一直寫(*p).m也不想寫更改運算符優先級以使人們編寫*(pm)以取消引用結構內的指針。 因此,添加了箭頭,這樣您就可以明智地執行p->m*sp而不會出現括號的丑陋。

當您使用箭頭運算符ptr->member時,它會隱式取消引用該指針。 它相當於(*ptr).member 當您向 object 指針發送消息時,該指針也被隱式取消引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM