2010-06-10 39 views
19

Đến từ nền Java Tôi đoán điều này được mong đợi. Tôi thực sự thích học Objective-C và bắt đầu phát triển các ứng dụng Mac, nhưng cú pháp chỉ là giết tôi.Bạn muốn tìm hiểu Mục tiêu-C nhưng cú pháp rất khó hiểu

Ví dụ:

-(void) setNumerator: (int) n 
{ 
    numerator = n; 
} 

rằng dash cho và tại sao được theo sau bởi khoảng trống trong ngoặc đơn là gì? Tôi chưa bao giờ thấy void trong ngoặc trong C/C++, Java hoặc C#. Tại sao chúng ta không có dấu chấm phẩy sau (int) n? Nhưng chúng tôi có ở đây:

-(void) setNumerator: (int) n; 

Và quy trình cấp phát, init, phát hành này là gì?

myFraction = [Fraction alloc]; 
myFraction = [myFraction init]; 
[myFraction release]; 

Và tại sao nó [myFraction release]; và không myFraction = [myFraction release];?

Và cuối cùng là những gì có dấu @ và triển khai này tương đương với Java như thế nào?

@implementation Fraction 

@end 

Tôi hiện đang đọc Programming in Objective C 2.0 và quá bực mình khi tìm hiểu cú pháp mới này cho ai đó trong nền Java.

CẬP NHẬT 1: Sau khi đọc tất cả các câu trả lời này và Lập trình trong Mục tiêu C 2.0 thêm một chút nữa, tất cả bắt đầu có ý nghĩa ngay bây giờ!

CẬP NHẬT 2: Cảm ơn mẹo tuyệt vời "hỗ trợ đa ngôn ngữ". Chúng tôi có thể kết hợp hai câu lệnh này vào một mặt hàng như vậy:

myFraction = [Fraction alloc]; 
myFraction = [myFraction init]; 

có thể được giảm xuống còn:

myFraction = [[Fraction alloc] init]; 
+1

Bạn sẽ quen với nó sau khi làm việc với nó một lúc. Nó có vẻ khá lạ với tôi khi tôi bắt đầu quá. – progrmr

+2

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Introduction/introObjectiveC.html Đọc phần này. Nó không khác gì bắt đầu một ngôn ngữ mới hơn bất kỳ ngôn ngữ nào khác. Có sự khác biệt về cú pháp và quản lý sự khác biệt về bộ nhớ nhưng không khác gì so với việc bắt đầu một số ngôn ngữ bậc cao khác. –

+0

Tôi có thể tiêu hóa cú pháp Objective-C trong 1 ngày. Nhưng tôi mất vài tuần để (hầu như không hiểu được quản lý bộ nhớ). Chúc may mắn! – ohho

Trả lời

26

Dấu gạch ngang đó là gì và tại sao bị theo sau là dấu ngoặc trong dấu ngoặc đơn?

Các dash - nghĩa "cấp sơ thẩm" (đó là mặc định trong Java). Khi bạn thấy dấu cộng + nghĩa là cấp lớp (giống như sử dụng static trong Java)

Khoảng trống trong dấu ngoặc đơn là kiểu trả về xem dưới đây.

Tại sao chúng ta không có dấu chấm phẩy sau (int) n? Nhưng chúng ta có nó ở đây:

-(void) setNumerator: (int) n; 

Bởi vì đó là phương pháp chữ ký, bạn có thể nghĩ về nó như một giao diện:

interface YourClass { 
     void setNumerator(int n);// see? semicolon 
} 

Cùng tình huống.

Mục tiêu-C có nguồn gốc trong C (thực tế đây là C thật với đối tượng) cần tệp tiêu đề (được loại bỏ hoàn toàn bằng Java), nơi bạn xác định những hàm/phương thức mà lớp của bạn sẽ có.

Tương đương nếu điều đó sẽ tồn tại trong java sẽ là:

// YourClass.java.h 

interface YourClass { 
     void setNumerator(int n); 
} 
// YourClass.java.m 
class YourClass { 
     void setNumerator(int n) { 
     this.n = n; 
     } 
    } 

Và những gì với alloc này, init, quá trình phát hành?

myFraction = [Fraction alloc]; 
myFraction = [myFraction init]; 
[myFraction release]; 

allo-init là tương đương cho new trong Java, alloc đó là khi bạn yêu cầu bộ nhớ cho đối tượng của bạn, alloc bộ nhớ yêu cầu, và init gọi phương thức init, tương đương với các nhà xây dựng lớp Java (btw Ruby có same behind scenes)

Không tương đương với bản phát hành trong Java vì nó là rác được thu thập, trong mục tiêu-C bạn phải giải phóng đối tượng của bạn.

BTW, khởi tạo cũng có thể là myFraction = [[Fraction alloc]init];

Và cuối cùng những gì với các dấu hiệu @ và thực hiện này tương đương trong Java là gì?

@implementation Fraction 

@end 

Đó là định nghĩa lớp như tôi đã đề cập trước đó.

Tôi hiện đang đọc Lập trình trong mục tiêu C 2.0 và nó thật sự bực bội khi học cú pháp mới này cho ai đó trong nền Java.

Dưới đây là một câu trả lời liên quan sẽ giúp bạn để làm quen hơn với các dấu ngoặc vuông:

Brief history of the "square brackets" is I remember it.

+0

Câu trả lời rất hữu ích, cảm ơn bạn! –

+0

Nhân tiện, dấu '-' tương đương với tĩnh trong Java hoặc '+' bên cạnh 'void'? –

+0

@Sahat: '+' giống như các phương thức tĩnh, nhưng chúng được gọi là các phương thức lớp. – dreamlax

6

Có lẽ có một wizz qua trang wiki cho Objective-C. Tôi đã làm và tìm thấy hầu hết các câu trả lời của bạn.

http://en.wikipedia.org/wiki/Objective-C

Tôi đến từ một nền java quá, trên cái nhìn đầu tiên objectivec trông không quá sexy.

Dường như C++ có ít bit cú pháp trên khuôn mặt.

Dấu gạch ngang đó là gì và tại sao theo sau là dấu ngoặc trong dấu ngoặc đơn?

trừ ở đây biểu thị một phương pháp dụ, một cộng biểu thị một phương pháp học

Tôi chưa bao giờ nhìn thấy khoảng trống trong ngoặc trong C/C++, Java hoặc C#.

đây là kiểu trả về

Sao chúng ta không có một dấu chấm phẩy sau (int) n?

Nếu bạn không cung cấp thân phương pháp thì cú pháp là khai báo phương thức - không phải là triển khai.

Và cuối cùng là những gì có dấu @ và triển khai này tương đương với Java như thế nào?

@implementation Fraction 

@end 

trong java có lẽ sẽ là

public class Fraction { 

} 
2

Đến từ cuốn sách đó, "-" dấu hiệu cho trình biên dịch rằng phương pháp này là một phương pháp dụ (một trong những sửa đổi dữ liệu). Dấu "+" cho máy tính biết rằng đó là một phương thức lớp (tĩnh).

2

Bạn nói rằng bạn đang đọc "Lập trình Objective C 2.0" bởi Stephen Kochan. Nó có thể không nhanh như bạn muốn nhưng một số thời gian dành cho người đứng đầu với cuốn sách đó sẽ phục vụ bạn tốt. Tất cả mọi thứ bạn đang yêu cầu được giải quyết trong cuốn sách Kochan. Bạn có thể bổ sung điều đó với những gì bạn tìm thấy trên trang web của Apple, trong Wikipedia và trên O'Reilly MacDevCenter.com chẳng hạn như "Inside the Objective-C Runtime". Việc thực hiện động các đối tượng động của C có một chút khác biệt là Java hoặc C++ và có một cái nhìn khác với nó, có lẽ do cách tiếp cận lấy cảm hứng từ Smalltalk. Đi với Kochan, bổ sung với web và xem liệu các điểm gắn bó quan trọng đã được xem xét chưa. Nếu không, đây sẽ là một nơi tuyệt vời cho họ.

2

Tôi cũng chỉ mới bắt đầu với Mục tiêu C và tôi đồng ý về cú pháp có vẻ như là người nước ngoài có liên quan đến Java hoặc C++. Điều tốt nhất tôi đã tìm thấy là chỉ đọc qua một số mã ví dụ. Tôi chắc rằng bạn có thể tìm thấy rất nhiều với một chút googling. Tôi không được phép đăng nhiều hơn một liên kết, nhưng nếu bạn google "mã ví dụ c mục tiêu", bạn sẽ tìm thấy nhiều mã.

Nếu bạn chỉ tìm kiếm một tài liệu tham khảo nhanh chóng với những gì một số cú pháp lạ có nghĩa, đây là một hướng dẫn khá tốt:

http://cocoadevcentral.com/articles/000082.php

0

Nếu tất cả những gì chỉ giúp bạn xuống, bắt đầu học Swift! Có tất cả những thứ tuyệt vời mà obj-c làm nhưng với cú pháp dễ nhận biết hơn nhiều. Và họ cũng nghĩ nhanh hơn. Có sẵn nếu bạn có tài khoản nhà phát triển táo - nhận phiên bản XCode 6/iOS8 beta.