2011-01-31 36 views

Trả lời

77

Thực ra, một phương pháp Objective-C chỉ là một hàm C với hai đối số luôn có mặt ở đầu.

này:

-(void)aMethod; 

là chính xác tương đương như sau:

void function(id self, SEL _cmd); 

Objective-C nhắn của là như vậy mà này:

[someObject aMethod]; 

là chính xác tương đương với này (hầu như - - có một vấn đề đối số ABI variadic nằm ngoài phạm vi của câu trả lời này):

objc_msgSend(someObject, @selector(aMethod)); 

objc_msgSend() tìm thấy việc thực hiện phù hợp của phương pháp này (bằng cách nhìn nó lên trên someObject) và sau đó, thông qua sự kỳ diệu của một tối ưu hóa cuộc gọi đuôi, nhảy đến việc thực hiện các phương pháp đó, đối với tất cả ý nghĩa và mục đích , hoạt động chính xác như cuộc gọi hàm C trông giống như sau:

function(someObject, @selector(aMethod)); 

Trước đây, mục tiêu-C ban đầu không được thực hiện, nhưng là bộ tiền xử lý C. Mọi thứ bạn có thể thực hiện trong Mục tiêu-C có thể được viết lại dưới dạng C. thẳng

Làm như vậy, tuy nhiên, sẽ là một nỗi đau hoàn toàn trong ass và không đáng để bạn vượt qua trải nghiệm giáo dục cực kỳ quan trọng.


Nói chung, bạn sử dụng phương pháp Objective-C khi nói chuyện với các đối tượng và chức năng khi làm việc với thẳng C goop. Cho rằng khá nhiều tất cả các hệ điều hành Mac OS X và iOS cung cấp các API mục tiêu-C - chắc chắn hoàn toàn như vậy đối với các điểm nhập chương trình cấp UI - sau đó bạn sử dụng hầu hết thời gian của Obj-C. Ngay cả khi viết mã mức mô hình của riêng bạn tương đối độc lập, bạn thường sẽ sử dụng Objective-C đơn giản bởi vì nó cung cấp một keo rất tự nhiên giữa trạng thái/dữ liệu & chức năng, một đối tượng thuê cơ bản của lập trình hướng đối tượng.

+0

Rất ngắn gọn và hữu ích. Tôi nhớ rằng C++ gốc cũng chỉ là một bộ tiền xử lý. – AlanObject

9

Trong Objective-C mỗi chức năng hoạt động trên một đối tượng , như

[myObject myFunction]

phương pháp AC có dạng:

return-type function-name(argument1, argument2, etc) {}

Một Objective-C dụ phương pháp có dạng:

-(return-type)function-name:argument1 {}

hoặc cho một chức năng đa luận

-(return-type)function-name:argument1 function-name:argument2 {}

tôi luôn luôn sử dụng Objective-C các phương thức kiểu trong chương trình Obj-C, mặc dù bạn vẫn có thể sử dụng các hàm kiểu C.

Tôi cho rằng tương đương trong C để [myObject myMethod:arg] có thể myObject.myMethod(arg)

+6

Thực tế trong C không có phương pháp, chỉ có chức năng tự do; cú pháp "tương đương C" cuối cùng mà bạn đã viết là cú pháp * C++ * cho các phương thức ví dụ. –

+0

Với tôi, phương pháp và chức năng là những điều tương tự. tức là có thể hoán đổi cho nhau bằng ngôn ngữ. Một số ngôn ngữ lập trình làm cho sự phân biệt, nhưng trên bảng, bạn sẽ có một số người sử dụng hàm trong đó phương thức phù hợp và ngược lại. – aqua

+4

@aqua: AFAIK, bạn nói về các phương pháp khi bạn đang nói về các đối tượng (http://en.wikipedia.org/wiki/Method_%28computer_programming%29), nếu không bạn có một hàm hoặc một chương trình con. Tuy nhiên, điểm cơ bản của tôi là cú pháp "tương đương C" cuối cùng mà bạn viết không có ý nghĩa, bởi vì trong C không có đối tượng ('struct' không có các phương thức instance). Thay vào đó, đó là cú pháp được sử dụng trong ** C++ ** cho các phương thức ví dụ. –

2

Đầu tiên là một chức năng đứng độc lập. Thứ hai là một phương thức thể hiện cho một lớp Objective-C. Vì vậy, tôi đoán bạn sẽ cần phiên bản thứ hai nếu bạn đang thực sự viết một lớp.

+0

miễn phí chức năng đáng tin cậy * Đơn giản chỉ cần đề cập đến một chức năng 'miễn phí' có thể bị nhầm lẫn với malloc/miễn phí. – dcousens

+0

@Daniel Thật vậy, tôi đã chỉnh sửa câu trả lời của mình. –

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