Objective-C so với C # như thế nào? [đóng cửa]


87

Gần đây tôi đã mua một máy Mac và sử dụng nó chủ yếu để phát triển C # trong VMWare Fusion. Với tất cả các ứng dụng Mac tuyệt vời xung quanh, tôi bắt đầu nghĩ về Xcode ẩn nấp chỉ bằng một cú nhấp chuột cài đặt và tìm hiểu Objective-C.

Cú pháp giữa hai ngôn ngữ trông rất khác nhau, có lẽ vì Objective-C có nguồn gốc từ C và C # có nguồn gốc từ Java / C ++. Nhưng các cú pháp khác nhau có thể được học để điều đó ổn.

Mối quan tâm chính của tôi là làm việc với ngôn ngữ và liệu nó có giúp tạo ra mã có cấu trúc tốt, dễ đọc và trang nhã hay không. Tôi thực sự thích các tính năng như LINQ và var trong C # và tự hỏi liệu có các tính năng tương đương hoặc tốt hơn / khác trong Objective-C hay không.

Tôi sẽ bỏ lỡ những tính năng ngôn ngữ nào khi phát triển với Objective-C? Tôi sẽ đạt được những tính năng nào?

Chỉnh sửa: Các so sánh khung là hữu ích và thú vị nhưng so sánh ngôn ngữ là những gì câu hỏi này thực sự đặt ra (một phần lỗi của tôi khi gắn thẻ ban đầu .net). Có lẽ cả Cocoa và .NET đều là những framework rất phong phú theo đúng nghĩa của chúng và cả hai đều có mục đích của chúng, một nhắm mục tiêu Mac OS X và Windows còn lại.

Cảm ơn bạn đã suy nghĩ kỹ lưỡng và quan điểm cân bằng hợp lý cho đến nay!


27
Xcode không hoàn hảo, nhưng nó chắc chắn có rất nhiều tính năng mạnh mẽ và hữu ích. Chê bai một thứ gì đó là "thuần túy xấu xa" mà không sao lưu nó hoặc cung cấp bất kỳ bối cảnh nào để so sánh là FUD không giúp ích được gì cho bất kỳ ai. Trong mọi trường hợp, nó không liên quan đến câu hỏi.
Quinn Taylor

11
Xcode 3.2 có thể là IDE tốt nhất mà tôi từng sử dụng, với khả năng xử lý điểm ngắt thanh lịch, phân tích tĩnh, thông báo lỗi nội tuyến và rất nhiều tính năng khác. Btw, đó là "Xcode" chứ không phải "XCode". @Nathan, tôi thực sự không hiểu tại sao bạn cần phải bôi nhọ Xcode bằng cách gọi nó là "thuần túy xấu xa" - mà không có bất kỳ sự biện minh nào - trong một cuộc thảo luận về ngôn ngữ.
PlagueHammer 02/09/09

6
Một điều lớn mà bạn sẽ đạt được khi sử dụng Objective-C là bạn sẽ có quyền truy cập vào các khuôn khổ Cocoa. Ngoài ra, C, C #, Java và C ++ đều có chung một di sản cú pháp. Objective-C lấy cú pháp của nó từ Smalltalk.
Amok 02/09/09

4
Bạn làm việc C # bằng cách sử dụng VMWare fusion? Chỉ cần sử dụng mono và monodevelop (là phiên bản nguồn mở của .NET và Visual Studio hoạt động trên Mac và Linux. Sử dụng Mono, bạn cũng có thể tạo các ứng dụng Mac và iPhone bằng C # đồng thời sử dụng thư viện .NET, cũng như Cocoa ...
Robin Heggelund Hansen

5
@ user668039 15 năm kinh nghiệm sử dụng C #? Nó được phát hành vào năm 2001!
Ian Newson 13/12/12

Câu trả lời:


89

Không có ngôn ngữ nào là hoàn hảo cho tất cả các nhiệm vụ và Objective-C cũng không ngoại lệ, nhưng có một số tính năng rất cụ thể. Giống như việc sử dụng LINQvar(mà tôi không biết về sự thay thế trực tiếp), một số trong số này hoàn toàn liên quan đến ngôn ngữ và một số khác liên quan đến khuôn khổ.

( LƯU Ý: Cũng như C # được kết hợp chặt chẽ với .NET, Objective-C được kết hợp chặt chẽ với Cocoa. Do đó, một số điểm của tôi có vẻ không liên quan đến Objective-C, nhưng Objective-C không có Cocoa cũng giống như C # không có .NET / WPF / LINQ, chạy dưới Mono, v.v. Đó không phải là cách mọi thứ thường được thực hiện.)

Tôi sẽ không giả vờ giải thích đầy đủ về sự khác biệt, ưu và nhược điểm, nhưng đây là một số điều đáng chú ý.

  • Một trong những phần tốt nhất của Objective-C là bản chất động - thay vì gọi các phương thức, bạn gửi tin nhắn, mà thời gian chạy định tuyến động. Được kết hợp (một cách thận trọng) với tính năng nhập động, điều này có thể làm cho rất nhiều mẫu mạnh mẽ đơn giản hơn hoặc thậm chí là tầm thường để triển khai.

  • Là một tập hợp siêu nghiêm ngặt của C, Objective-C tin tưởng rằng bạn biết mình đang làm gì. Không giống như cách tiếp cận được quản lý và / hoặc an toàn kiểu của các ngôn ngữ như C # và Java, Objective-C cho phép bạn làm những gì bạn muốn và trải qua những hậu quả. Rõ ràng là điều này đôi khi có thể nguy hiểm, nhưng thực tế là ngôn ngữ không chủ động ngăn cản bạn làm hầu hết mọi thứ là khá mạnh mẽ. ( CHỈNH SỬA: Tôi nên làm rõ rằng C # cũng có các tính năng và chức năng "không an toàn", nhưng hành vi mặc định của chúng là mã được quản lý, bạn phải chọn không tham gia một cách rõ ràng. Để so sánh, Java chỉ cho phép mã an toàn kiểu chữ và không bao giờ để lộ các con trỏ thô trong theo cách mà C và những người khác làm.)

  • Danh mục (thêm / sửa đổi các phương thức trên một lớp mà không cần phân lớp hoặc có quyền truy cập vào nguồn) là một con dao hai lưỡi tuyệt vời. Nó có thể đơn giản hóa rất nhiều hệ thống phân cấp kế thừa và loại bỏ mã, nhưng nếu bạn làm điều gì đó kỳ lạ, đôi khi kết quả có thể gây khó hiểu.

  • Cocoa làm cho việc tạo các ứng dụng GUI đơn giản hơn nhiều theo nhiều cách, nhưng bạn phải xoay sở với mô hình. Thiết kế MVC phổ biến trong Cocoa và các mẫu như đại biểu, thông báo và ứng dụng GUI đa luồng rất phù hợp với Objective-C.

  • Các ràng buộc ca cao và quan sát giá trị khóa có thể loại bỏ hàng tấn mã keo và các khuôn khổ ca cao tận dụng điều này một cách rộng rãi. Điều phối động của Objective-C hoạt động song song với điều này, vì vậy loại đối tượng không quan trọng miễn là nó tuân thủ khóa-giá trị.

  • Bạn có thể sẽ bỏ lỡ các khái niệm chung và không gian tên, và chúng có những lợi ích của chúng, nhưng trong tư duy và mô hình Objective-C, chúng sẽ là những thứ tốt đẹp hơn là cần thiết. (Chung chung là tất cả về an toàn kiểu và tránh truyền, nhưng nhập động trong Objective-C làm cho điều này về cơ bản không phải là vấn đề. Không gian tên sẽ tốt nếu được thực hiện tốt, nhưng nó đủ đơn giản để tránh xung đột mà chi phí được cho là lớn hơn lợi ích, đặc biệt cho mã kế thừa.)

  • Đối với đồng thời, Blocks (một tính năng ngôn ngữ mới trong Snow Leopard và được triển khai trong điểm số của API cacao) cực kỳ hữu ích. Một vài dòng (thường được kết hợp với Grand Central Dispatch, là một phần của libsystem trên 10.6) có thể loại bỏ phần soạn sẵn quan trọng của các hàm gọi lại, ngữ cảnh, v.v. (Các khối cũng có thể được sử dụng trong C và C ++ và chắc chắn có thể được thêm vào C #, Điều đó sẽ thật tuyệt vời.) NSOperationQueue cũng là một cách rất tiện lợi để thêm đồng thời vào mã của riêng bạn, bằng cách gửi các lớp con NSOperation tùy chỉnh hoặc các khối ẩn danh mà GCD tự động thực thi trên một hoặc nhiều luồng khác nhau cho bạn.


7
Về mặt kỹ thuật, C # có tất cả các tính năng nguồn không phải kiểu an toàn mà objC làm được: con trỏ thô, số học con trỏ, mảng không được kiểm tra giới hạn, liên kết alloca,. Nó chỉ không làm cho chúng dễ dàng truy cập - bạn cần phải chọn tham gia một cách rõ ràng.
Pavel Minaev 02/09/09

8
Tôi chỉ đơn giản đề cập đến Cocoa vì phần lớn sự hấp dẫn của lập trình trong Objective-C là do các framework Cocoa. C # có thú vị không nếu không có .NET và / hoặc WPF? Người hỏi đã đề cập cụ thể đến LINQ, vì vậy anh ta rõ ràng đang nhìn xa hơn ngôn ngữ, đến trải nghiệm.
Quinn Taylor

7
Cái nào tốt. Tôi không cố đấu với C #. Nếu tôi phải viết phần mềm Windows, đó là những gì tôi sẽ sử dụng. Tôi chỉ đang cố gắng chỉ ra những điểm tương đồng và khác biệt giữa các ngôn ngữ và các công cụ liên quan. Rõ ràng là bạn có nhiều kinh nghiệm hơn với C # và tôi với Objective-C. Tôi đánh giá cao sự giải thích của bạn, nhưng có lẽ những câu trả lời mang tính xây dựng hơn và ít chia rẽ hơn sẽ hữu ích nhất.
Quinn Taylor,

11
Nó không phải là chẻ tóc, Quinn. Tôi chỉ đơn thuần chỉ ra rằng những gì bắt đầu như một so sánh ngôn ngữ đã trở thành cuộc thảo luận chung về việc Ca cao tốt như thế nào tại một số điểm trong câu trả lời của bạn. Tôi vẫn muốn chỉ ra rằng điểm của bạn về Ca cao không phải là so sánh - họ nói "nó làm tốt X" - và nó cũng có thể đúng như vậy - nhưng họ không nói "nó làm X tốt hơn / tệ hơn C # + WPF ", đó là nội dung của câu hỏi.
Pavel Minaev 02/09/09

6
1 câu trả lời tuyệt vời Quinn
h4xxr

54

Tôi đã lập trình bằng C, C ++ và C # được hơn 20 năm, lần đầu tiên bắt đầu vào năm 1990. Tôi vừa quyết định xem xét sự phát triển của iPhone và Xcode và Objective-C. Ôi trời ơi ... tất cả những lời phàn nàn về Microsoft mà tôi nhận lại, giờ tôi mới nhận ra rằng những thứ code tồi tệ đến mức nào. Objective-C quá phức tạp so với những gì C # làm. Tôi đã bị hỏng với C # và bây giờ tôi đánh giá cao tất cả công sức mà Microsoft đã bỏ ra. Chỉ đọc Objective-C với phương thức gọi là rất khó đọc. C # là thanh lịch trong điều này. Đó chỉ là ý kiến ​​của tôi, tôi hy vọng rằng ngôn ngữ phát triển của Apple cũng tốt như các sản phẩm của Apple, nhưng tôi yêu quý, chúng có rất nhiều điều để học hỏi từ Microsoft. Không có câu hỏi ứng dụng C # .NET Tôi có thể tải ứng dụng lên và chạy nhanh hơn nhiều lần so với XCode Objective-C. Apple chắc chắn nên lấy một phần trong cuốn sách của Microsoft ở đây và sau đó chúng tôi sẽ có một môi trường hoàn hảo. :-)


47
Mặc dù bạn đã xem qua một cuốn sách dành cho nhà phát triển iPhone, bạn vẫn có thể tạo một ứng dụng nhanh hơn trên nền tảng mà bạn đã có 20 năm kinh nghiệm? AMAZING
kubi

25
Tôi đang có trải nghiệm giống hệt như Waz. Tôi cũng biết ơn nhiều hơn cho công việc Microsoft đã đặt trong C # và các công cụ phát triển như Visual Studio, sau khi tôi đã bắt đầu học tập C. Mục tiêu
René

4
Đó cũng là kinh nghiệm của tôi khi nghiên cứu mục tiêu-c, tính đơn giản quá mức so với c #. @ alexy13 Bạn đã bỏ sót phần c và c ++ nào trong tin nhắn gốc? Có nhiều thập kỷ kinh nghiệm trong một họ ngôn ngữ giúp RẤT NHIỀU đánh giá mức độ khó khăn khi làm cùng một công việc với một ngôn ngữ khác từ cùng họ.
Anderson Fortaleza,

5
câu trả lời hàng đầu này như thế nào? nó không phải là một câu trả lời ngắn gọn, chỉ cần một ý kiến thiên vị rõ ràng của một số ngôn ngữ ông đã học qua đêm vs một ngôn ngữ, ông đã sử dụng hơn 20 năm ... rõ ràng là bạn sẽ không được như thành thạo về ngôn ngữ mới
Heavy_Bullets

3
"Just reading Objective-C with method invokes is difficult to read"- đây chỉ là một lập luận rất chủ quan được đề cập ở đây như là nhược điểm của obj-C. Tất cả những điều khác chỉ là những lời ngụy biện.
skywinder

46

Không có đánh giá kỹ thuật nào ở đây, nhưng tôi chỉ thấy Objective-C kém dễ đọc hơn nhiều. Với ví dụ mà Cinder6 cung cấp cho bạn:

C #

List<string> strings = new List<string>();
strings.Add("xyzzy");                  // takes only strings
strings.Add(15);                       // compiler error
string x = strings[0];                 // guaranteed to be a string
strings.RemoveAt(0);                   // or non-existant (yielding an exception)

Objective-C

NSMutableArray *strings = [NSMutableArray array];
[strings addObject:@"xyzzy"];
[strings addObject:@15];
NSString *x = strings[0];
[strings removeObjectAtIndex:0];

Nó trông thật kinh khủng. Tôi thậm chí đã thử đọc 2 cuốn sách trên đó, họ đã đánh mất tôi từ rất sớm, và thông thường tôi không hiểu được điều đó với sách / ngôn ngữ lập trình.

Tôi rất vui vì chúng tôi có Mono cho Mac OS, vì nếu tôi phải dựa vào Apple để tạo cho tôi một môi trường phát triển tốt ...


17
Bỏ qua thực tế là dòng đầu tiên nên kết thúc bằng [NSMutableArray array](anh ấy đang bị rò rỉ bộ nhớ) và dòng thứ 4 phải bắt đầu bằng NSString* xhoặc id x(lỗi biên dịch) ... Vâng, Objective-C thiếu generics (tôi thành thật không nhớ chúng), bạn không 't lập chỉ mục các đối tượng với cú pháp mảng, và các API thường dài dòng hơn. To-may-to, to-mah-to. Nó thực sự đi xuống những gì bạn muốn xem. (Bạn có thể viết cùng một đoạn mã trong C ++ STL và tôi nghĩ nó thật ghê tởm.) Đối với tôi, mã có thể đọc được thường có nghĩa là văn bản của mã cho bạn biết nó đang làm gì và do đó mã Objective-C thích hợp hơn.
Quinn Taylor,

18
Tôi thực sự không thấy có gì sai với cú pháp như vậy - lý do chính khiến nó cảm thấy ít đọc hơn là vì 1) nó không quen thuộc với mọi người đến từ nền C, và 2) nó được sử dụng ở giữa các cấu trúc C đơn giản, nơi nó trông xa lạ. Mặt khác, tên-tham-số-như-một-phần-của-phương-thức-tên-của-phương-thức-nhỏ-thực sự làm cho các cuộc gọi dễ hiểu hơn ngay từ đầu. Trên thực tế, mẫu mã C # của bạn thể hiện tốt điều này - nó sẽ không biên dịch, vì List<T>.Removelấy một chuỗi làm đối số và loại bỏ lần xuất hiện đầu tiên của chuỗi đó. Để loại bỏ theo chỉ mục, bạn cần RemoveAt.
Pavel Minaev 02/09/09

12
... trong khi phiên bản objC với removeObjectAtIndex:, tuy dài dòng hơn, nhưng cũng không rõ ràng về những gì nó làm.
Pavel Minaev 02/09/09

6
Điểm tuyệt vời, Pavel. Ngoài ra, sự mâu thuẫn giữa strings[0]strings.RemoveAt(0)làm giảm đi sự rõ ràng, ít nhất là đối với tôi. (Ngoài ra, nó luôn làm tôi phát cáu khi tên phương pháp bắt đầu với một chữ cái viết hoa ... Tôi biết đó là một tỉ mỉ quá nhỏ, nhưng nó chỉ là lạ.)
Quinn Taylor

4
Trong trường hợp của tôi, đối với nhiều người, khả năng đọc của "công cụ" ảnh hưởng đến năng suất của tôi. Tuy nhiên, tôi cảm thấy thoải mái và hiệu quả với nhiều ngôn ngữ Objective-C, chưa bao giờ là một trong số chúng và đó không phải là do thiếu cố gắng. Nhưng một lần nữa, vào cuối ngày, tất cả đều là về sở thích cá nhân. Không giống như 20 năm trước, bạn không bị buộc phải sử dụng ngôn ngữ X để nhắm mục tiêu nền tảng Y. Bạn chọn những gì phù hợp với bạn nhất.
TimothyP

17

Quản lý bộ nhớ thủ công là thứ mà những người mới bắt đầu làm quen với Objective-C dường như gặp nhiều vấn đề nhất, chủ yếu là vì họ nghĩ rằng nó phức tạp hơn thực tế.

Mục tiêu-C và Ca cao theo phần mở rộng dựa trên các công ước về thực thi; biết và tuân theo một bộ quy tắc rất nhỏ và đổi lại bạn nhận được rất nhiều miễn phí nhờ thời gian chạy năng động.

Quy tắc không đúng 100%, nhưng đủ tốt cho hàng ngày là:

  • Mọi lệnh gọi đến allocphải được khớp với một releaseở cuối phạm vi hiện tại.
  • Nếu giá trị trả về cho phương thức của bạn đã được lấy trước allocthì nó phải được trả về return [value autorelease];thay vì được so khớp bởi a release.
  • Sử dụng thuộc tính, và không có quy tắc ba.

Sau đây là lời giải thích dài hơn.

Quản lý bộ nhớ dựa trên quyền sở hữu; chỉ chủ sở hữu của một cá thể đối tượng mới được giải phóng đối tượng, những người khác luôn không làm gì cả. Điều này có nghĩa là trong 95% tất cả các mã bạn xử lý Objective-C như thể nó được thu gom.

Vậy 5% còn lại thì sao? Bạn có ba phương thức để tìm, bất kỳ cá thể đối tượng nào nhận được từ phương thức này đều thuộc sở hữu của phạm vi phương thức hiện tại :

  • alloc
  • Bất kỳ phương thức nào bắt đầu bằng từ mới , chẳng hạn như newhoặc newService.
  • Bất kỳ phương thức nào có chứa bản sao từ, chẳng hạn như copymutableCopy.

Phương thức có ba tùy chọn khả thi về việc phải làm gì với các cá thể đối tượng thuộc sở hữu của nó trước khi thoát:

  • Giải phóng nó bằng cách sử dụng releasenếu nó không còn cần thiết.
  • Cấp quyền sở hữu cho một trường (biến phiên bản) hoặc một biến toàn cục bằng cách chỉ định nó.
  • Từ bỏ quyền sở hữu nhưng cho người khác cơ hội nắm quyền sở hữu trước khi phiên bản biến mất bằng cách gọi autorelease.

Vậy khi nào bạn nên chủ động giành quyền sở hữu bằng cách gọi điện retain? Hai trường hợp:

  • Khi gán các trường trong trình khởi tạo của bạn.
  • Khi thực hiện thủ công phương pháp setter.

2
+1 Bản tóm tắt xuất sắc. Nghe rất giống với khi tôi học C cách đây nhiều năm.
Alex Angas

4
Chỉ cần làm rõ, tính năng thu gom rác được hỗ trợ đầy đủ cho Objective-C trên Mac và người ta không cần thực hiện bất kỳ quản lý bộ nhớ thủ công nào. Quản lý bộ nhớ thủ công chỉ được yêu cầu trong iOS.
PlagueHammer

3
Tuy nhiên, sẽ rất tốt nếu bạn học những kiến ​​thức cơ bản về quản lý bộ nhớ, nếu chỉ để cải thiện hiệu suất khi bạn cần (không cần phải chạy bộ sưu tập rác).
FeifanZ

3
iOS 5 đã giới thiệu ARC, loại bỏ nhu cầu phải phát hành đối tượng được phân bổ theo cách thủ công. Nhưng nó vẫn không ở đâu dễ dàng như C #. Bạn phải nhớ rằng Objective-C đã hơn 20 năm tuổi và nó đã giữ một số yêu cầu của ngôn ngữ trong những ngày đó: đó là biết khi nào cần phân bổ và khi nào cần giải phóng / giải phóng bộ nhớ. C # đã loại bỏ tất cả những điều này cho bạn. Phải nói rằng, Cocoa có rất nhiều API chưa thể truy cập được trong Windows Phone. Chẳng hạn như cử chỉ, xa hơn điều khiển khi nói đến giao diện người dùng sự kiện vv ...
jyavenard

10

Chắc chắn, nếu mọi thứ bạn thấy trong cuộc sống của mình là Objective C, thì cú pháp của nó giống như duy nhất có thể. Chúng tôi có thể gọi bạn là "trinh nữ lập trình".

Nhưng vì rất nhiều mã được viết bằng C, C ++, Java, JavaScript, Pascal và các ngôn ngữ khác, bạn sẽ thấy ObjectiveC khác với tất cả chúng, nhưng không phải theo cách tốt. Họ có lý do cho điều này? Hãy xem các ngôn ngữ phổ biến khác:

C ++ đã thêm rất nhiều tính năng bổ sung vào C, nhưng nó chỉ thay đổi cú pháp ban đầu khi cần thiết.

C # đã thêm rất nhiều tính năng bổ sung so với C ++ nhưng nó chỉ thay đổi những thứ xấu xí trong C ++ (như loại bỏ "::" khỏi giao diện).

Java đã thay đổi rất nhiều thứ, nhưng nó vẫn giữ nguyên cú pháp quen thuộc ngoại trừ những phần cần thay đổi.

JavaScript là một ngôn ngữ hoàn toàn động có thể làm được nhiều điều mà ObjectiveC không thể. Tuy nhiên, những người tạo ra nó đã không phát minh ra một cách mới để gọi các phương thức và truyền các tham số chỉ để khác biệt với phần còn lại của thế giới.

Visual Basic có thể truyền các tham số không theo thứ tự, giống như ObjectiveC. Bạn có thể đặt tên cho các tham số, nhưng bạn cũng có thể chuyển chúng theo cách thông thường. Bất cứ điều gì bạn sử dụng, đó là cách phân cách bằng dấu phẩy bình thường mà mọi người đều hiểu. Dấu phẩy là dấu phân cách thông thường, không chỉ trong ngôn ngữ lập trình mà còn trong sách, báo và ngôn ngữ viết nói chung.

Object Pascal có cú pháp khác với C, nhưng cú pháp của nó thực sự DỄ DÀNG hơn để người lập trình đọc (có thể không phải đối với máy tính, nhưng ai quan tâm máy tính nghĩ gì). Vì vậy, có thể họ lạc đề, nhưng ít nhất kết quả của họ tốt hơn.

Python có một cú pháp khác, thậm chí còn dễ đọc hơn (đối với con người) so với Pascal. Vì vậy, khi họ thay đổi nó, làm cho nó khác đi, ít nhất họ đã làm cho nó tốt hơn cho các lập trình viên chúng tôi.

Và sau đó chúng ta có ObjectiveC. Thêm một số cải tiến cho C, nhưng phát minh ra cú pháp giao diện riêng, gọi phương thức, truyền tham số và những gì không. Tôi tự hỏi tại sao họ không hoán đổi + và - để cộng trừ hai số. Nó sẽ còn mát hơn.

Steve Jobs đã gặp khó khăn khi hỗ trợ ObjectiveC. Tất nhiên anh ta không thể hỗ trợ C #, tốt hơn, nhưng thuộc về đối thủ cạnh tranh tồi tệ nhất của anh ta. Vì vậy, đây là một quyết định chính trị, không phải là một quyết định thực tế. Công nghệ luôn bị ảnh hưởng khi các quyết định công nghệ được đưa ra vì lý do chính trị. Anh ta nên lãnh đạo công ty mà anh ta làm tốt, và để các vấn đề về lập trình cho các chuyên gia thực sự.

Tôi chắc rằng sẽ có nhiều ứng dụng hơn nữa cho iPhone nếu anh ấy quyết định viết iOS và hỗ trợ các thư viện bằng bất kỳ ngôn ngữ nào khác ngoài ObjectiveC. Đối với tất cả mọi người, ngoại trừ những người hâm mộ khó tính, những lập trình viên còn trinh và Steve Jobs, ObjectiveC trông thật lố bịch, xấu xí và ghê tởm.


3
2 đoạn cuối tổng hợp tất cả
Zakos

Ồ đúng rồi, cú pháp trông có vẻ vô lý nhưng điểm quý giá của ngôn ngữ Objective-C là nó có khả năng phản ánh gần như dễ sử dụng nhất trong tất cả các ngôn ngữ và một số tính năng thời gian chạy thực sự tuyệt vời khiến một số mô hình gần như trở nên tầm thường để triển khai. Ví dụ: khi sử dụng Objective-C, tôi không bao giờ cần quan tâm đến việc sử dụng bảng tuyến tính nào - danh sách liên kết hoặc vectơ hoặc bất cứ thứ gì - chỉ cần NSArraynó xử lý việc lựa chọn thuật toán tốt nhất dựa trên máy và bản chất của dữ liệu.
Maxthon Chan

Tôi bắt đầu công việc đầu tiên của mình với tư cách là một lập trình viên (trinh nữ) triển khai giao diện người dùng iOS-App trong Objective-C. Tất cả những gì tôi muốn bây giờ (sau 3 năm) là thoát khỏi 'hòn đảo' cô đơn đó và học một thứ gì đó độc lập với nền tảng hơn và do đó có tính tinh vi hơn. Ngoài ra, để tìm hiểu xem các khung công tác khác cũng được cập nhật nhanh như vậy - và có lỗi. Chào! Tính năng mới! - Crash ... Hy vọng trung tâm việc làm (Đức) dành một số tiền cho tôi về hướng dẫn bằng Java và / hoặc C ++ / C # vì tôi không còn muốn phát triển cho Apple sh * t nữa.
anneblue

5

Một điều tôi thích ở aim-c là hệ thống đối tượng dựa trên các thông điệp, nó cho phép bạn làm những điều thực sự tốt đẹp mà bạn không thể làm trong C # (ít nhất là không cho đến khi chúng hỗ trợ từ khóa động!).

Một điều tuyệt vời khác khi viết ứng dụng ca cao là Trình tạo giao diện, nó đẹp hơn rất nhiều so với trình thiết kế biểu mẫu trong Visual Studio.

Những điều về obj-c làm tôi khó chịu (với tư cách là nhà phát triển C #) là thực tế là bạn phải quản lý bộ nhớ của riêng mình (có bộ sưu tập rác, nhưng điều đó không hoạt động trên iPhone) và nó có thể rất dài dòng vì cú pháp bộ chọn và tất cả [].


2
dynamicsẽ chỉ giúp bạn được nửa chừng - việc triển khai một đối tượng động thực sự, ngay cả với những thứ nhỏ nhặt như ủy quyền thông điệp, thật tẻ nhạt ngay cả trong C # 4.0. Mặt khác, cái giá phải trả cho thông điệp động thực sự linh hoạt truyền qua một la ObjC là mất an toàn kiểu.
Pavel Minaev 02/09/09

3
Cần chỉ ra rằng Objective-C cho phép nhập tĩnh chọn tham gia, điều này mang lại mức độ an toàn về kiểu chữ cao hơn nhiều. Một số người thích kiểm tra thời gian biên dịch, những người khác thích kiểm tra thời gian chạy. Điều tốt đẹp (trong cả hai ngôn ngữ) là sự lựa chọn không cần phải tuyệt đối.
Quinn Taylor

3
Trình thiết kế Windows Forms không quá xuất sắc, nhưng nếu bạn có thể sử dụng WPF (kể từ .NET 3.0) thì rất khó để đánh bại Expression Blend ...
Nate

Bạn có thể làm rất nhiều điều này với System.Reflection kết hợp với các phần mở rộng trong C # 3.0, bạn có thể gọi bất kỳ phương thức nào bạn tìm thấy, nhưng không phải là phương thức truyền thông điệp thực sự, nó sẽ giống như obj.PassMessage("function_name", params object[] args);việc truyền thông báo tốt hơn được tích hợp vào ngôn ngữ, phương thức bị thiếu có thể gọi được trên đối tượng bình thường sẽ là cần thiết.
Filip Kunc

4

Là một lập trình viên mới bắt đầu với Objective-C cho iPhone, đến từ C # 4.0, tôi thiếu các biểu thức lambda và đặc biệt là Linq-to-XML. Các biểu thức lambda là C # -specific, trong khi Linq-to-XML thực sự tương phản .NET so với Cocoa nhiều hơn. Trong một ứng dụng mẫu mà tôi đang viết, tôi có một số XML trong một chuỗi. Tôi muốn phân tích cú pháp các phần tử của XML đó thành một tập hợp các đối tượng.

Để thực hiện điều này trong Objective-C / Cocoa, tôi phải sử dụng lớp NSXmlParser . Lớp này dựa vào một đối tượng khác thực hiện giao thức NSXMLParserDelegate với các phương thức được gọi (đọc: thông báo được gửi) khi một thẻ mở phần tử được đọc, khi một số dữ liệu được đọc (thường là bên trong phần tử) và khi một số thẻ kết thúc phần tử được đọc . Bạn phải theo dõi trạng thái và trạng thái phân tích cú pháp. Và tôi thành thật không biết điều gì sẽ xảy ra nếu XML không hợp lệ. Thật tuyệt khi đi sâu vào chi tiết và tối ưu hóa hiệu suất, nhưng ôi trời, đó là rất nhiều mã.

Ngược lại, đây là mã trong C #:

using System.Linq.Xml;
XDocument doc = XDocument.Load(xmlString);
IEnumerable<MyCustomObject> objects = doc.Descendants().Select(
         d => new MyCustomObject{ Name = d.Value});

Vậy là xong, bạn đã có một bộ sưu tập các đối tượng tùy chỉnh được rút ra từ XML. Nếu bạn muốn lọc các phần tử đó theo giá trị hoặc chỉ lọc những phần tử chứa một thuộc tính cụ thể hoặc nếu bạn chỉ muốn 5 phần tử đầu tiên hoặc bỏ qua phần 1 đầu tiên và lấy phần 3 tiếp theo hoặc chỉ cần tìm xem có phần tử nào được trả về không ... BAM, tất cả đều ở đó trong cùng một dòng mã.

Có rất nhiều lớp mã nguồn mở giúp cho việc xử lý này dễ dàng hơn rất nhiều trong Objective-C, do đó sẽ giải quyết được nhiều việc nặng nhọc. Nó không phải là điều này được tích hợp sẵn.

* LƯU Ý: Tôi không thực sự biên dịch đoạn mã ở trên, nó chỉ có nghĩa là một ví dụ để minh họa sự thiếu chi tiết tương đối theo yêu cầu của C #.


Tuy nhiên, điều quan trọng không phải ở đây là không có quá nhiều "thiếu chi tiết" về phần C # trong so sánh này, chỉ có điều rằng độ dài được chứa trong các lớp khung công tác .net mà bạn đang sử dụng để phân tích cú pháp XML của mình. Nếu bạn kiểm tra mã bên trong những mã đó, bạn có khả năng tìm thấy một mã C # tốt hơn, thậm chí có thể dài dòng hơn.
XIVSolutions, 09/04

3

Có lẽ sự khác biệt quan trọng nhất là quản lý bộ nhớ. Với C #, bạn nhận được bộ sưu tập rác, do nó là một ngôn ngữ dựa trên CLR. Với Objective-C, bạn cần tự quản lý bộ nhớ.

Nếu bạn đến từ nền tảng C # (hoặc bất kỳ ngôn ngữ hiện đại nào cho vấn đề đó), việc chuyển sang ngôn ngữ không có quản lý bộ nhớ tự động sẽ thực sự khó khăn, vì bạn sẽ dành nhiều thời gian viết mã để quản lý bộ nhớ đúng cách (và gỡ lỗi như tốt).


6
ObjectC đã theo dõi việc thu gom rác những ngày này. Mặt khác, C # cho phép bạn tự quản lý bộ nhớ nếu bạn muốn (nhờ các con trỏ thô).
Pavel Minaev 02/09/09

3
Tôi không thấy quản lý bộ nhớ thủ công trong Objective-C (trong bối cảnh các khuôn khổ của Apple) là một gánh nặng: chu trình giữ lại / phát hành / tự động vui lòng ít cồng kềnh hơn nhiều so với quản lý bộ nhớ "truyền thống" trong C và C ++.
mipadi 02/09/09

5
Điều này không đúng với DSO - ngay cả trên môi trường không thu gom rác như iPhone, nội dung giữ lại / phát hành và tự động khôi phục mất khoảng 10 phút để tìm hiểu và sau đó không thành vấn đề. Tôi đã tìm thấy rất nhiều C # -ers thích phóng đại những thách thức của việc quản lý bộ nhớ. Nó gần giống như họ sợ họ sẽ bắt đầu thích obj-c quá nhiều cách khác ...;)
h4xxr

4
Những điều cơ bản về quản lý bộ nhớ thủ công không khó. Nhưng nó có thể trở nên phức tạp thực sự nhanh chóng khi bạn bắt đầu chuyển các đối tượng được phân bổ xung quanh và cần xử lý các đồ thị đối tượng phức tạp, bởi vì bạn cần phải tuân thủ cẩn thận các quy tắc như ai chịu trách nhiệm giải phóng và khi nào. Các triển khai đếm tham chiếu làm cho nó dễ dàng hơn một chút, ngoại trừ bạn cần phải xử lý các chu trình trong đồ thị đối tượng ... so với C #, tất cả IMO này là một sự khác biệt lớn.
DSO

1

Đây là một bài viết khá hay so sánh hai ngôn ngữ: http://www.coderetard.com/2008/03/16/c-vs-objective-c/


Thật đáng tiếc khi trang này tuyên bố là ở UTF-8 nhưng có đủ loại thay thế khó chịu cho dấu nháy đơn và dấu ngoặc kép. Tôi nghĩ văn bản của anh ấy sử dụng dấu ngoặc kép "cong", nhưng chúng chắc chắn cắt xén mã ...
Quinn Taylor

họ dường như đã đánh cắp toàn bộ phần giới thiệu của họ, nhưng ngay cả bài báo nguồn cũng bị trộn mã. không phải là một bài báo đặc biệt tuyệt vời.
dnord 02/09/09

-2

Ngoài sự khác biệt về mô hình giữa hai ngôn ngữ, không có nhiều sự khác biệt. Tôi không muốn nói nhiều, bạn có thể làm những việc tương tự (có lẽ không dễ dàng như vậy) với .NET và C # như bạn có thể làm với Objective-C và Cocoa. Kể từ Leopard, Objective-C 2.0 có tính năng thu gom rác, vì vậy bạn không tự quản lý bộ nhớ trừ khi muốn (khả năng tương thích mã với các ứng dụng iPhone và Mac cũ hơn là 2 lý do để bạn muốn).

Liên quan đến mã có cấu trúc, có thể đọc được, phần lớn gánh nặng ở đó thuộc về lập trình viên, cũng như với bất kỳ ngôn ngữ nào khác. Tuy nhiên, tôi thấy rằng thông báo truyền mô hình tự cho thấy mã có thể đọc được với điều kiện bạn đặt tên cho các hàm / phương thức của mình một cách thích hợp (một lần nữa, giống như bất kỳ ngôn ngữ nào khác).

Tôi sẽ là người đầu tiên thừa nhận rằng tôi không rành về C # hoặc .NET. Nhưng những lý do Quinn liệt kê ở trên là khá nhiều lý do mà tôi không quan tâm đến việc trở nên như vậy.


-3

Các lệnh gọi phương thức được sử dụng trong obj-c làm cho mã dễ đọc, theo ý kiến ​​của tôi thanh lịch hơn nhiều so với c # và obj-c được xây dựng trên đầu c nên tất cả mã c sẽ hoạt động tốt trong obj-c. Người bán hàng lớn đối với tôi là obj-c là một tiêu chuẩn mở để bạn có thể tìm thấy các trình biên dịch cho bất kỳ hệ thống nào.


2
ISO C # cũng là một tiêu chuẩn mở. Ngoài ra, theo tôi biết, trình biên dịch ObjC duy nhất còn tồn tại là gcc.
Pavel Minaev 02/09/09

@Pavel: Ngoài ra còn có Trình biên dịch đối tượng di động ( users.telenet.be/stes/compiler.html ) và tiếng kêu.
mipadi 02/09/09

1
Trên thực tế, GCC không còn là trình biên dịch duy nhất - Clang và LLVM là một cặp công nghệ được thiết kế và phát triển để thay thế GCC và làm những điều mà nó không bao giờ có thể làm được, bao gồm cả biên dịch JIT. Đây là cốt lõi của OpenCL trong Snow Leopard. Chúng cũng có thể mở rộng sang các ngôn ngữ khác và rất đáng để thử.
Quinn Taylor,

2
Thành thật mà nói, tôi sẽ không coi tính di động là một chuyên gia của Objective-C. Thay vào đó, điểm mạnh nằm ở sự phát triển nhanh chóng và giảm khối lượng mã để hoàn thành cùng một nhiệm vụ.
Quinn Taylor,

Cảm ơn đã sửa lỗi của tôi về tính khả dụng của trình biên dịch. Chà, về mặt kỹ thuật thì tính di động cũng có - ví dụ như tôi có thể sử dụng MinGW / ObjC trên Win32 - theo nghĩa đó, nó cũng di động như chính gcc vậy. Tất nhiên, các thư viện sẽ không ở đó (mặc dù ... có GnuStep / Win32 không?), Nhưng tình hình này không thực sự tồi tệ hơn những gì chúng ta có với Mono; vì vậy nói chung, tôi muốn nói rằng tính di động không phải là điểm mạnh của cả hai bên.
Pavel Minaev 02/09/09
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.