Câu hỏi Lựa chọn thay thế cho Objective-C cho lập trình Mac là gì?


Tôi đã trở nên rất thoải mái trong thế giới ngôn ngữ lập trình không có con trỏ, thu thập rác. Bây giờ tôi phải viết một thành phần Mac nhỏ. Tôi đã học Objective-C, nhưng khi tôi đối mặt với khả năng của con trỏ lơ lửng và sự cần thiết phải quản lý số lượng giữ lại, tôi cảm thấy chán nản.

Tôi biết rằng Objective-C bây giờ có bộ sưu tập rác nhưng điều này chỉ hoạt động với Leopard. Thành phần của tôi cũng phải làm việc với Tiger.

Tôi cần phải truy cập một số thư viện Cocoa không có sẵn cho Java, để quy tắc ra vũ khí thường lệ của tôi lựa chọn.

Lựa chọn thay thế của tôi là gì? Đặc biệt là không có con trỏ rõ ràng và thu gom rác tự động.


10
2017-11-06 11:04


gốc


Mục tiêu-C 2.0 có bộ sưu tập rác. - Adam Ernst
Anh ta nói rằng phải làm việc với Tiger nữa. Quy tắc này ra khỏi bộ thu gom rác. - Hejazzman
Nó không thực sự quan trọng mà Obj-C không có bộ sưu tập rác (luôn luôn). Nó sử dụng một hệ thống đếm tham chiếu với các bể tự động giải phóng. Đánh dấu các biến lớp OBj-C đúng cách có nghĩa là mã cần thiết sẽ được thêm vào để quản lý số lượng ref - bạn KHÔNG cần quản lý một cách rõ ràng việc đếm ref trong Objective-C bằng cách sử dụng AppKit. - Chris Becke
@ Chris, đó là chỉ đúng trong mục tiêu-C 2.0 mà là Leopard và ở trên chỉ. Trong Objective-C 1.0, bạn phải tạo các phương thức accessor riêng của mình bao gồm quản lý việc giữ lại / sao chép / gán và giải phóng trong -dealloc. Điều đó không có nghĩa là nó thực sự khó hơn nhiều, nhưng bạn phải làm nhiều hơn là chỉ "đánh dấu các biến lớp một cách chính xác". - Andrew Madsen


Các câu trả lời:


Ý bạn là gì bởi "thành phần?" Bạn có nghĩa là một đoạn mã hoặc một thư viện mà bạn sẽ trao cho người khác để liên kết đến ứng dụng của họ không? Nếu vậy thì sẽ không thực tế khi sử dụng bất kỳ ngôn ngữ bắc cầu nào vào thời điểm này. Mặc dù rất nhiều cầu nối rất đẹp nhưng hầu như luôn có các biến chứng và vấn đề mà hầu hết các nhà phát triển ứng dụng sẽ không sẵn lòng giải quyết để sử dụng một thành phần duy nhất, đặc biệt nếu nó liên quan đến thời gian chạy đáng kể.

Các cây cầu có giá trị nhất để kết nối các thư viện ngôn ngữ khác vào ứng dụng Objective C của bạn. Trong khi bạn có thể viết các ứng dụng khá hoàn chỉnh bằng cách sử dụng chúng, làm như vậy thường đòi hỏi sự hiểu biết tốt hơn về Objective C hơn là viết một ứng dụng Objective C, vì bạn cần hiểu và đối phó với ngôn ngữ, mô hình đối tượng, luồng và sự phân bổ bộ nhớ không khớp xảy ra.

Đây cũng là lý do tại sao nhiều người cho rằng ngay cả khi bạn khá quen thuộc với một ngôn ngữ, cố gắng học Cocoa bằng cách sử dụng ngôn ngữ đó thông qua một cây cầu thường khó khăn hơn khi học nó bằng cách sử dụng Objective C.

Cuối cùng, phần lớn hỗ trợ gần đây cho các ngôn ngữ bắc cầu là do "BridgeSupport", một tính năng được thêm vào trong Leopard. Ngay cả những cây cầu mà trước đó đã di chuyển theo hướng, đôi khi theo cách mà sử dụng ngôn ngữ bắc cầu trên Tiger và Leopard có thể có sự khác biệt đáng kể. Ngoài ra, hiện tại không có hỗ trợ cầu nối cho iPhone và hầu hết các ngôn ngữ bắc cầu sẽ không hoạt động trên đó, nếu đó là vấn đề.

Cuối cùng, nếu bạn đang viết một thư viện sẽ được liên kết với các ứng dụng khác, bạn cần chạy trên Tiger và Leopard, và bạn cần truy cập vào các API chỉ có Cocoa mà tôi nghĩ bạn sẽ tìm thấy bằng cách sử dụng bất kỳ giải pháp nào không phải Objective C.


19
2017-11-06 12:45



Không phải những gì tôi muốn nghe, nhưng đôi khi đó là cách nó đi. Tôi có thể nhìn vào Python mặc dù, và xem những gì tôi có thể làm. - Steve McLeod


Bạn co thể thử PyObjC để viết các ứng dụng Cocoa trong python, hoặc MacRuby nếu bạn quan tâm đến Ruby.


11
2017-11-06 11:18



Nhưng bạn gần như chắc chắn muốn sử dụng Leo / Xcode 3+ để làm PyObjC, và tôi muốn kiểm tra xem mã bạn tạo ra có hoạt động trước khi Leopard hay không. - Matthew Schinckel


Bạn không nên bị đe dọa bởi việc giữ lại / phát hành tài liệu tham khảo của Cocoa. Thực hành dễ dàng hơn nhiều, dễ dàng hơn nhiều so với người hâm mộ GC sẽ khiến bạn tin tưởng. Các Quy tắc quản lý bộ nhớ Cocoa chết đơn giản, chúng chỉ ảnh hưởng đến một lượng nhỏ mã của bạn và thậm chí là cái đó mã có thể được tạo tự động.

Đây là mẹo. Bạn đóng gói mã MM của bạn trong các phương thức truy cập và luôn luôn sử dụng accessors. Xcode có các tập lệnh tích hợp để tạo các trình tiếp cận thích hợp hoặc nếu bạn cần linh hoạt hơn, có các ứng dụng phần 3 như Accessorizer.

Đây không phải là một cách tiếp cận xâm nhập - bạn chỉ cần lo lắng về việc giữ lại một đối tượng nếu bạn cần giữ nó để sử dụng sau này, và nếu bạn định làm điều đó, bạn sẽ cần một biến cá thể trong đó giữ nó đi. Và, nếu bạn đang sử dụng KVO và các ràng buộc, bạn sẽ cần sử dụng các trình truy cập để đảm bảo các thông báo quan sát thích hợp được kích hoạt. Về cơ bản, nếu bạn đang sử dụng các phương pháp OOP và Cocoa tốt, thực tế không có thêm suy nghĩ hoặc nỗ lực nào liên quan đến quản lý bộ nhớ.

Hầu hết những người gặp khó khăn với quản lý bộ nhớ "thủ công" của Cocoa đang làm như vậy là kết quả của việc lạm dụng nó. Sai lầm phổ biến nhất là phân tán mã có liên quan khắp nơi. Điều đó có nghĩa là thiếu sót, phát hành thêm, v.v ... sẽ khó tìm.


9
2017-11-07 01:46





Hãy thử bất kỳ cây cầu Cocoa nào được liệt kê ở đây http://www.cocoadev.com/index.pl?CocoaBridges

Bạn cũng có thể thử F-Script - một phương ngữ smalltalk được viết riêng cho MacOSX / Cocoa.


3
2017-11-06 11:19





RubyCocoa đang dần dần ấn tượng hơn và tôi đã thấy nhiều triển khai thành công khi sử dụng nó. Đó là, tất nhiên, nếu Ruby là tách trà của bạn ...


2
2017-11-06 11:21



Ngoài ra, hãy xem MacRuby. macruby.org - mk12


Bạn luôn có thể sử dụng REALbasic (www.realsoftware.com). Thật dễ dàng và thú vị để sử dụng, không miễn phí mặc dù. Bạn không thể làm cho dylibs (hoặc dll) sử dụng nó, nhưng bạn có thể sử dụng dylibs và dll trong mã của bạn. Và bạn cũng có thể sử dụng thư viện ca cao


1
2017-11-09 09:46





Đừng quên rằng bạn có thể sử dụng java là tốt, và tôi không có nghĩa là cầu java-ca cao, tôi có nghĩa là java thực tế.

Ngoài ra còn có một gói từ táo cung cấp cho bạn quyền truy cập vào một vài tính năng của OSX.

Ngoài ra để nhận xét về điểm của Shem, nếu bạn nhắm mục tiêu osx 10.5 trở lên, bạn có thể tận dụng bộ sưu tập rác.


1
2017-11-09 18:31





Nếu bạn muốn cú pháp lisp thì Nu là một lisp được thực hiện trên đỉnh của Objective-C http://www.programming.nu/


1
2017-12-30 04:19



Có vẻ như không có chuyển hướng từ www, liên kết là programming.nu - tvon


Ngoài ra, FreePascal có thể tạo ra các ứng dụng Carbon gốc (đang được tiến hành cho Coccoa)


1
2018-01-09 21:46





Nhìn vào Python và wxPython (wxWidgets bằng Python).

Các wxWidgets có một mẫu thiết kế ứng dụng App-Doc-View rất thanh lịch, rất, rất đẹp. Nó không được sử dụng đủ, IMO. Tôi đã không tìm thấy bất kỳ ví dụ wxPython của ví dụ App-Doc-View này, vì vậy bạn phải sử dụng các ví dụ C để giải thích cách nó sẽ hoạt động như thế nào trong Python.

Tôi sẽ đăng các ví dụ, nhưng tôi chưa có tất cả các công việc.


0
2017-11-06 11:11



Không có gì có thể sử dụng Interface Builder để phát triển giao diện người dùng. Bạn sẽ phải làm việc heaps khó khăn hơn để có được một "Mac-Like" UI sử dụng bất kỳ API khác. - Matthew Schinckel
Làm việc chăm chỉ hơn - vâng. Không phải "đống", nhưng chắc chắn khá nhiều công việc. - S.Lott
Tôi rất thích nhìn thấy một ví dụ tốt về một ứng dụng wxWidgets trên OSX ... Tất cả chúng đều giống như crap. - schwa
@schwa: "trông giống như crap"? Các tiện ích hoặc mã thực hiện ứng dụng? - S.Lott
@ S.Lott - Không. Vấn đề với các ứng dụng không phải là bản địa là nhiều hơn về "cảm thấy" hơn là "nhìn". Các nút ở các địa điểm sai, phím tắt không chuẩn, v.v. Có nhiều thứ hơn rất nhiều so với việc tạo một ứng dụng Mac gốc hơn là chỉ sử dụng các tiện ích gốc (hoặc bản địa). - Sherm Pendley