2011-07-09 44 views
15

Trong mục tiêu-C sự khác nhau giữa việc truy cập biến trong lớp học bằng cách sử dụng -> (toán tử mũi tên) và . (toán tử dấu chấm) là gì? Có phải -> được sử dụng để truy cập trực tiếp so với dấu chấm (.) không phải là trực tiếp không?Sự khác biệt giữa '->' (toán tử mũi tên) và '.' (dấu chấm toán tử) trong Objective-C?

+1

Câu hỏi tương tự: [Dot (“”) điều hành và mũi tên (“->”) sử dụng toán tử trong C so với Objective-C] (http://stackoverflow.com/q/9072688/642706) –

Trả lời

9

Mũi tên, ->, là một viết tắt cho một dấu chấm kết hợp với một dereference con trỏ, hai là như nhau cho một số con trỏ p:

p->m 
(*p).m 

Mũi tên ký hiệu được thừa hưởng từ C và C có nó bởi vì thành viên cấu trúc truy cập toán tử (.) liên kết lỏng hơn toán tử dereferencing (*) và không ai muốn viết (*p).m mọi lúc hoặc không muốn thay đổi toán tử ưu tiên để mọi người viết *(p.m) để dereference một con trỏ bên trong một cấu trúc. Vì vậy, mũi tên đã được thêm vào để bạn có thể làm cả hai p->m*s.p một cách hợp lý mà không có sự xấu xí của dấu ngoặc đơn.

0

Khi bạn sử dụng toán tử mũi tên ptr->member, nó hoàn toàn dereferencing con trỏ đó. Nó tương đương với (*ptr).member. Khi bạn gửi tin nhắn đến một con trỏ đối tượng, con trỏ cũng bị bỏ qua.

18

-> là toán tử C truyền thống để truy cập thành viên của cấu trúc được tham chiếu bởi con trỏ. Vì các đối tượng Objective-C (thường) được sử dụng như con trỏ và một lớp Objective-C là một cấu trúc, bạn có thể sử dụng -> để truy cập các thành viên của nó, thường (thường) tương ứng với các biến mẫu. Lưu ý rằng nếu bạn đang cố truy cập một biến mẫu từ bên ngoài lớp thì biến cá thể phải được đánh dấu là công khai.

Vì vậy, ví dụ:

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

truy cập vào dụ biến name, khai báo trong SomeClass (hoặc một trong superclasses của nó), tương ứng với đối tượng obj.

Mặt khác, . là (thường) được sử dụng làm dot syntax cho phương thức getter và setter . Ví dụ:

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

tương đương với sử dụng phương pháp getter name:

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

Nếu name là một declared property, nó có thể cung cấp cho phương thức getter của nó một tên khác.

Cú pháp chấm cũng được sử dụng cho các phương thức setter. Ví dụ:

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

tương đương với:

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

Sự khác biệt rõ ràng hơn nếu bạn đặt tên biến cá thể khác với thuộc tính (ví dụ: '@synthesize name = ivar_name').Sau đó, bạn chỉ có thể truy cập vào biến cá thể bằng 'someObject-> ivar_name' và bạn chỉ có thể truy cập bộ getter thuộc tính với' someObject.name'. – Chuck

+0

@Bararious Tôi thấy câu trả lời này khó hiểu vào lúc này, tại sao có quá nhiều thảo luận về "tên" là gì? Cho dù tên là phương thức getter/setter của kiểu thể hiện. obj, một con trỏ, phải được trì hoãn trước khi bạn có thể truy cập tên, bất kỳ tên nào có thể được, corrent? Không nên câu trả lời của bạn chỉ đơn giản là obj-> tên là giống như (* obj) .name? Hoặc là câu trả lời của bạn nói rằng, một phần, rằng G mục tiêu getters/setters không phải deference con trỏ của obj và chỉ đơn giản là có sẵn bằng cách sử dụng ký hiệu chấm? Có lẽ nếu dấu ba chấm không được sử dụng cho mỗi khai báo của SomeClass * obj =…; Tôi sẽ hiểu rõ hơn ... :) –

+0

@Chọn cái gì "Lớp Objective-C là một cấu trúc" nghĩa là gì? Điều đó có ý nghĩa gì đối với một lớp học là một cấu trúc ?! Về cơ bản chúng không khác nhau sao? lớp là loại tham chiếu và cấu trúc là các loại giá trị? (xin lỗi tôi đã ping bạn nhưng Bavarious không còn sử dụng tài khoản của mình nữa) – Honey

Các vấn đề liên quan