Objective-C, C # ile nasıl karşılaştırılır? [kapalı]


87

Yakın zamanda bir Mac satın aldım ve bunu öncelikle VMWare Fusion altında C # geliştirme için kullanıyorum. Etrafımdaki tüm güzel Mac uygulamalarıyla, Xcode'un yalnızca bir yükleme tıklaması ötede gizlendiğini ve Objective-C'yi öğrenmeyi düşünmeye başladım.

İki dil arasındaki sözdizimi çok farklı görünüyor, çünkü muhtemelen Objective-C'nin kökenleri C'ye ve C #'nin kökenleri Java / C ++ 'dır. Ancak farklı sözdizimleri öğrenilebilir, bu yüzden sorun olmaz.

Asıl endişem, dille çalışmak ve iyi yapılandırılmış, okunabilir ve zarif bir kod üretmeye yardımcı olup olmayacağıdır. LINQ ve C # 'da var gibi özelliklerden gerçekten keyif alıyorum ve Objective-C'de eşdeğer veya daha iyi / farklı özellikler olup olmadığını merak ediyorum.

Objective-C ile hangi dil özelliklerini geliştirmeyi özleyeceğim? Hangi özellikleri kazanacağım?

Düzenleme: Çerçeve karşılaştırmaları yararlı ve ilgi çekicidir, ancak bir dil karşılaştırması bu sorunun gerçekten sorduğu şeydir (kısmen, başlangıçta etiketleme konusunda benim hatam .net). Muhtemelen hem Cocoa hem de .NET, kendi başlarına çok zengin çerçevelerdir ve her ikisinin de amacı vardır, biri Mac OS X'i ve diğerini Windows'u hedeflemektedir.

Şimdiye kadarki iyi düşünülmüş ve makul ölçüde dengeli bakış açıları için teşekkür ederiz!


27
Xcode mükemmel değildir, ancak kesinlikle birçok güçlü ve kullanışlı özelliğe sahiptir. Bir şeyi yedeklemeden veya karşılaştırma için herhangi bir bağlam sağlamadan "saf kötü" olarak kötülemek, kimseye yardımcı olmayan FUD'dir. Her halükarda, soruyla alakası yok.
Quinn Taylor

11
Xcode 3.2, zarif kesme noktası işleme, statik analiz, satır içi hata mesajları ve tonlarca başka özelliği ile muhtemelen şimdiye kadar kullandığım en iyi IDE'dir. Btw, bu "Xcode" ve "XCode" değil. @Nathan, Xcode'u dillerle ilgili bir tartışmada - herhangi bir gerekçe olmaksızın - "saf kötü" olarak adlandırarak neden kötülemeniz gerektiğini gerçekten anlamıyorum.
Debajit

6
Objective-C'yi kullanarak kazanacağınız büyük bir şey, Cocoa çerçevelerine erişiminizin olacağıdır. Ayrıca, C, C #, Java ve C ++ ortak bir sözdizimsel mirası paylaşır. Objective-C sözdizimini Smalltalk'tan alır.
Amok

4
VMWare fusion kullanarak C # çalışması mı yapıyorsunuz? Yalnızca mono ve monodevelop'u kullanın (.NET ve Visual Studio'nun Mac ve Linux'ta çalışan açık kaynaklı bir sürümüdür. Mono kullanarak, C # kullanarak Mac ve iPhone uygulamaları oluşturabilir ve aynı zamanda .NET kitaplığını ve Cocoa'yı da kullanabilirsiniz. ...
Robin Heggelund Hansen

5
@ user668039 C # kullanarak 15 yıllık deneyim? 2001'de piyasaya sürüldü!
Ian Newson

Yanıtlar:


89

Hiçbir dil tüm görevler için mükemmel değildir ve Objective-C bir istisna değildir, ancak bazı çok özel nitelikler vardır. Kullanmak gibi LINQve var(bunun için doğrudan değiştirildiğini bilmiyorum), bunlardan bazıları kesinlikle dil ile ilgili, diğerleri ise çerçeveyle ilgilidir.

( NOT: C # .NET ile sıkı bir şekilde birleştirildiği gibi, Objective-C de Cocoa ile sıkı bir şekilde birleştirilir. Bu nedenle, bazı noktalarım Objective-C ile ilgisiz görünebilir, ancak Cocoa'sız Objective-C, .NET olmadan C # ile benzerdir / WPF / LINQ, Mono altında çalışıyor vb. İşler genellikle böyle yapılmaz.)

Farklılıkları, artıları ve eksileri tam olarak detaylandırıyormuş gibi yapmayacağım, ama işte akla gelen bazı şeyler.

  • Objective-C'nin en iyi bölümlerinden biri dinamik doğasıdır - yöntemleri çağırmak yerine, çalışma zamanının dinamik olarak yönlendirdiği mesajlar gönderirsiniz. Dinamik yazımla (mantıklı bir şekilde) birleştirildiğinde, bu birçok güçlü kalıbı daha basit ve hatta uygulanması önemsiz hale getirebilir.

  • C'nin katı bir üst kümesi olan Objective-C, ne yaptığınızı bildiğinize güveniyor. C # ve Java gibi dillerin yönetilen ve / veya dizgi güvenli yaklaşımının aksine, Objective-C, istediğinizi yapmanıza ve sonuçlarını deneyimlemenize izin verir. Açıkçası bu bazen tehlikeli olabilir, ancak dilin çoğu şeyi yapmanıza aktif olarak engel olmaması gerçeği oldukça güçlüdür. ( DÜZENLEME: C # 'ın "güvenli olmayan" özelliklere ve işlevlere de sahip olduğunu açıklığa kavuşturmalıyım, ancak bunların varsayılan davranışı, açıkça devre dışı bırakmanız gereken yönetilen koddur. Karşılaştırıldığında, Java yalnızca tür güvenli koda izin verir ve ham işaretçileri hiçbir zaman C ve diğerlerinin yaptığı gibi.)

  • Kategoriler (alt sınıflara girmeden veya kaynağa erişmeden bir sınıfa yöntemler eklemek / değiştirmek) harika bir iki ucu keskin kılıçtır. Devralma hiyerarşilerini büyük ölçüde basitleştirebilir ve kodu ortadan kaldırabilir, ancak tuhaf bir şey yaparsanız, sonuçlar bazen şaşırtıcı olabilir.

  • Cocoa, GUI uygulamaları oluşturmayı birçok yönden çok daha basit hale getirir, ancak kafanızı paradigmanın etrafına sarmanız gerekir. MVC tasarımı Cocoa'da yaygındır ve temsilciler, bildirimler ve çok iş parçacıklı GUI uygulamaları gibi modeller Objective-C'ye çok uygundur.

  • Kakao bağlamaları ve anahtar-değer gözlemi tonlarca yapıştırıcı kodunu ortadan kaldırabilir ve Cocoa çerçeveleri bunu kapsamlı bir şekilde kullanır. Objective-C'nin dinamik gönderimi bununla birlikte çalışır, bu nedenle anahtar-değer uyumlu olduğu sürece nesnenin türü önemli değildir.

  • Muhtemelen jenerikleri ve ad alanlarını özleyeceksiniz ve bunların faydaları var, ancak Objective-C zihniyetinde ve paradigmasında, bunlar gerekliliklerden ziyade kibarlık olacaktır. (Jenerikler tamamen tip güvenliği ve çevrimden kaçınmakla ilgilidir, ancak Objective-C'de dinamik yazım bunu esasen bir sorun haline getirmez. Ad alanları iyi yapılırsa güzel olurdu, ancak maliyetin, özellikle avantajlardan daha ağır bastığı anlaşmazlıkları önlemek için yeterince basittir. eski kod için.)

  • Eşzamanlılık için, Bloklar (Snow Leopard'da yeni bir dil özelliği ve Cocoa API'lerinin puanlarında uygulanan) son derece kullanışlıdır. Birkaç satır (genellikle 10.6'da libsystem'in bir parçası olan Grand Central Dispatch ile birleştirilir), geri arama işlevlerinin, bağlamın vb. Önemli standartlarını ortadan kaldırabilir (Bloklar ayrıca C ve C ++ 'da kullanılabilir ve kesinlikle C #' a eklenebilir, Bu harika olurdu.) NSOperationQueue, GCD'nin sizin için otomatik olarak bir veya daha fazla iş parçacığı üzerinde yürüttüğü özel NSOperation alt sınıflarını veya anonim blokları göndererek kendi kodunuza eşzamanlılık eklemenin de çok uygun bir yoludur.


7
Teknik olarak, C #, ObjC'nin yaptığı türden güvenli olmayan tüm güç özelliklerine sahiptir: ham işaretçiler, işaretçi aritmetiği, sınırlı denetlenmemiş diziler, birleşimler alloca,. Sadece onları kolayca erişilebilir kılmaz - açıkça kaydolmanız gerekir.
Pavel Minaev

8
Sadece Cocoa'dan bahsediyorum çünkü Objective-C'deki programlamanın cazibesinin çoğu Cocoa çerçevelerinden kaynaklanıyor. .NET ve / veya WPF olmadan C # ilginç olur mu? Soruyu soran özellikle LINQ'dan bahsetti, bu yüzden açıkça dilin ötesine, deneyime bakıyor.
Quinn Taylor

7
Hangisi iyi. C # ile kavga çıkarmaya çalışmıyorum. Windows yazılımı yazmam gerekse bunu kullanırdım. Ben sadece diller ve ilgili araçlar arasındaki benzerlik ve farklılıklara işaret etmeye çalışıyorum. Açıkça görülüyor ki C # ile daha tecrübelisiniz ve ben Objective-C ile. Açıklamalarınızı takdir ediyorum, ancak belki de daha yapıcı cevaplar ve daha az saç kırılması en faydalı olacaktır.
Quinn Taylor

11
Saçları kırmak değil Quinn. Sadece bir dil karşılaştırması olarak başlayan şeyin, cevabınızın bir noktasında Cocoa'nın ne kadar iyi olduğuna dair genel tartışmaya dönüştüğünü belirttim. Yine de Kakao ile ilgili puanlarınızın karşılaştırma olmadığını - "X iyi yapıyor" diyorlar - ve durum böyle olabilir - ancak "X'i C # + 'dan daha iyi / daha kötü yapıyor demiyorlar. WPF ", sorunun genel olarak ne olduğu.
Pavel Minaev

6
+1 mükemmel cevap Quinn
h4xxr

54

Şu anda 20 yılı aşkın süredir C, C ++ ve C # ile programlama yapıyorum, ilk olarak 1990'da başladım. İPhone geliştirmesine ve Xcode ve Objective-C'ye bir göz atmaya karar verdim. Aman Tanrım ... Microsoft ile ilgili tüm şikayetleri geri alıyorum, kodun ne kadar kötü olduğunu şimdi anlıyorum. Objective-C, C # 'nın yaptığına kıyasla çok karmaşıktır. C # ile şımartıldım ve şimdi Microsoft'un ortaya koyduğu tüm sıkı çalışmaları takdir ediyorum. Sadece Objective-C'yi metot çağrılarıyla okumak zor. C # bunda zariftir. Bu sadece benim fikrim, Apple geliştirme dilinin Apple ürünleri kadar iyi olduğunu umuyordum, ama canım, Microsoft'tan öğrenecek çok şeyi var. Hiç şüphe yok C # .NET uygulaması Bir uygulamayı XCode Objective-C'den birçok kez daha hızlı çalıştırabilirim. Apple, Microsoft'un kitabından kesinlikle bir sayfa çıkarmalı ve o zaman mükemmel bir ortama sahip oluruz. :-)


47
Bir iPhone geliştirici kitabına bakmış olsanız bile, 20 yıllık deneyime sahip olduğunuz bir platformda bir uygulamayı daha hızlı oluşturabiliyor musunuz? İNANILMAZ
kubi

25
Waz ile tamamen aynı deneyimi yaşıyorum. Ayrıca, Objective C'yi öğrenmeye başladıktan sonra Microsoft'un C # ile yaptığı çalışmalar ve Visual Studio gibi geliştirme araçları için çok daha minnettarım.
René

4
C # ile karşılaştırıldığında nesnel-c, aşırı karmaşıklık üzerinde çalışırken benim de deneyimim buydu. @ alexy13 Orijinal mesajdaki c ve c ++ 'nın hangi bölümünü kaçırdınız? Bir dil ailesinde onlarca yıllık deneyime sahip olmak, bir LOT'un aynı işi aynı aileden başka bir dille yapmanın ne kadar zor olduğunu değerlendirmesine yardımcı olur.
Anderson Fortaleza

5
bu en iyi cevap nasıl? bu kısa bir cevap değil, sadece bir gecede öğrendiği bir dil ile 20 yıldan fazla bir süredir kullandığı bir dil hakkında açıkça önyargılı bir görüş ... belli ki yeni dilde yetkin olmayacaksınız
Heavy_Bullets

3
"Just reading Objective-C with method invokes is difficult to read"- Burada sadece bir tek çok sübjektif Obj C eksileri olarak burada sözü edilen argüman. Diğer her şey sadece tartışmalı söylemdir.
skywinder

46

Burada teknik inceleme yok, ancak Objective-C'yi çok daha az okunaklı buluyorum. Cinder6'nın size verdiği örnek göz önüne alındığında:

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)

Amaç-C

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

Korkunç görünüyor. Hatta üzerine 2 kitap okumayı denedim, beni erken kaybettiler ve normalde bunu programlama kitapları / dilleri ile anlamıyorum.

Mac OS için Mono'ya sahip olduğumuz için memnunum çünkü bana iyi bir geliştirme ortamı sağlamak için Apple'a güvenmek zorunda kalsaydım ...


17
[NSMutableArray array]Bunun yerine 1. satırın bitmesi gerektiği gerçeğini (hafızayı sızdırıyor) ve 4. satırın NSString* xveya id x(derleme hatası) ile başlaması gerektiğini göz ardı ederek ... Evet, Objective-C jeneriklerden yoksun (dürüst olmak gerekirse onları kaçırmıyorum), Nesneleri dizi sözdizimi ile indeksler ve API'ler genellikle daha ayrıntılıdır. To-may-to, to-mah-to. Gerçekten görmeyi tercih ettiğiniz şeye bağlı. (Aynı kodu C ++ STL'de yazabilirdiniz ve bunun iğrenç olduğunu düşünürdüm.) Bana göre okunabilir kod, genellikle kodun metninin size ne yaptığını söylemesi anlamına gelir ve bu nedenle Objective-C kodu tercih edilir.
Quinn Taylor

18
Sözdiziminde gerçekten yanlış bir şey bulamıyorum - daha az okunabilir hissetmesinin ana nedeni , 1) C geçmişinden gelen herkese aşina olmaması ve 2) düz C yapılarının ortasında kullanılmasıdır. uzaylı görünüyor. Öte yandan, Smalltalkish adlandırılmış parametreler yöntem adının bir parçası olarak çağrıları başlangıçtan itibaren daha anlaşılır hale getirir. Aslında, C # kod örneğiniz bunu iyi gösterir - derlenmez, çünkü argüman olarak bir dizeyiList<T>.Remove alır ve bu dizenin ilk oluşumunu kaldırır. Dizine göre kaldırmak için ihtiyacınız var . RemoveAt
Pavel Minaev

12
... ObjC versiyonu removeObjectAtIndex:daha ayrıntılı olsa da, ne işe yaradığı konusunda da nettir .
Pavel Minaev

6
Mükemmel puan, Pavel. Ayrıca, en azından benim için, arasındaki tutarsızlık strings[0]ve strings.RemoveAt(0)netliği azaltıyor. (Ayrıca, yöntem isimleri büyük harfle başladığında her zaman canımı sıkıyor ... Bunun küçük bir kıkırdama olduğunu biliyorum, ama sadece garip.)
Quinn Taylor

4
Benim durumumda, birçok insan için olduğu gibi, "aracın" okunabilirliği verimliliğimi etkiliyor. Pek çok dilde rahat ve üretkenim Objective-C ancak hiçbir zaman onlardan biri olmadı ve bunun sebebi denememem değil. Ama yine de, günün sonunda her şey kişisel tercihlerle ilgili. 20 yıl öncesinin aksine, Y platformunu hedeflemek için X dilini kullanmak zorunda değilsiniz. Size en uygun olanı siz seçersiniz.
TimothyP

17

Manuel bellek yönetimi, Objective-C'ye yeni başlayanlar için en çok sorun yaşadığı bir şeydir, çünkü çoğunlukla olduğundan daha karmaşık olduğunu düşünürler.

Amaç-C ve Kakao, uzantı gereği uygulama yerine konvansiyonlara dayanır; çok küçük bir dizi kuralı bilir ve bunlara uyarsanız, karşılığında dinamik çalışma süresi ile ücretsiz olarak çok şey alırsınız.

% 100 doğru değil, ancak her gün için yeterince iyi:

  • Her çağrı , mevcut kapsamın sonunda allocbir ile eşleştirilmelidir release.
  • Yönteminizin dönüş değeri tarafından elde edilmişse, bir ile eşleştirilmek yerine allocile döndürülmelidir .return [value autorelease];release
  • Özellikleri kullanın ve üçüncü kural yoktur.

Daha uzun açıklama aşağıdadır.

Bellek yönetimi sahipliğe bağlıdır; yalnızca bir nesne örneğinin sahibi nesneyi bırakmalı, diğer herkes her zaman hiçbir şey yapmamalıdır. Bu, tüm kodun% 95'inde Objective-C'yi çöp toplanmış gibi ele aldığınız anlamına gelir.

Peki diğer% 5 ne olacak? Dikkat etmeniz gereken üç yönteminiz var, bu yöntemden alınan herhangi bir nesne örneği, geçerli yöntem kapsamına aittir :

  • alloc
  • Veya gibi yeni kelimesiyle başlayan herhangi bir yöntem .newnewService
  • Sözcüğünü içeren herhangi bir yöntem gibi, kopyalama copyve mutableCopy.

Yöntemin, çıkmadan önce sahip olduğu nesne örnekleriyle ne yapılacağına dair üç olası seçeneği vardır:

  • releaseArtık gerekmiyorsa kullanarak bırakın .
  • Bir alana (örnek değişkeni) veya genel bir değişkene, onu atayarak sahiplik verin .
  • Sahiplikten vazgeçin, ancak çağrı yaparak örnek kaybolmadan önce başka birine sahipliği alma şansı verin autorelease.

Öyleyse, arayarak ne zaman proaktif olarak mülkiyeti almalısınız retain? İki durum:

  • Başlatıcılarınıza alanlar atarken.
  • Ayarlayıcı yöntemini manuel olarak uygularken.

2
+1 Mükemmel özet. Yıllar önce C'yi öğrendiğim zamana çok benziyor.
Alex Angas 05

4
Sadece açıklığa kavuşturmak için, çöp toplama, Mac'teki Objective-C için tam olarak desteklenir ve herhangi bir manuel bellek yönetimi yapmaya gerek yoktur. Manuel bellek yönetimi yalnızca iOS'ta gereklidir.
Debajit

3
Yine de, yalnızca ihtiyaç duyduğunuzda performansı artırmak için (çöp toplamayı çalıştırmak zorunda değilsiniz) bellek yönetiminin temellerini öğrenmek iyidir.
FeifanZ

3
iOS 5, tahsis edilen nesneyi manuel olarak serbest bırakmak zorunda kalmadan ARC'yi tanıttı. Ama yine de hiçbir yerde C # kadar kolay değil. Objective-C'nin 20 yaşın üzerinde olduğunu ve o günlerde dillerin bazı gereksinimlerini geride bıraktığını unutmamalısınız: bu, ne zaman tahsis edileceğini ve ne zaman belleği serbest bırakacağını / serbest bırakacağını bilmektir. C # sizin için bunların hepsini kaldırdı. Bunu söyledikten sonra, Cocoa'nın henüz Windows Phone'da erişilebilir olmayan birçok API'si var.
Hareketler

10

Elbette, hayatınızda gördüğünüz her şey Hedef C ise, sözdizimi mümkün olan tek şey gibi görünür. Size "programlama bakiresi" diyebiliriz.

Ancak C, C ++, Java, JavaScript, Pascal ve diğer dillerde çok sayıda kod yazıldığından, ObjectiveC'nin hepsinden farklı olduğunu, ancak iyi bir şekilde olmadığını göreceksiniz. Bunun için bir nedenleri var mıydı? Diğer popüler dilleri görelim:

C ++, C'ye birçok ekstra ekledi, ancak orijinal sözdizimini yalnızca gerektiği kadar değiştirdi.

C #, C ++ 'ya kıyasla çok fazla ekstra ekledi, ancak yalnızca C ++' da çirkin olan şeyleri değiştirdi (arayüzden "::" yi kaldırmak gibi).

Java birçok şeyi değiştirdi, ancak değişikliğin gerekli olduğu kısımlar dışında tanıdık sözdizimini korudu.

JavaScript, ObjectiveC'nin yapamadığı birçok şeyi yapabilen tamamen dinamik bir dildir. Yine de yaratıcıları, dünyanın geri kalanından farklı olmak için yeni bir yöntem çağırma ve parametre geçirme yolu icat etmediler.

Visual Basic, tıpkı ObjectiveC gibi parametreleri sırayla aktarabilir. Parametreleri adlandırabilirsiniz, ancak bunları normal yolla da iletebilirsiniz. Ne kullanırsanız kullanın, herkesin anlayacağı normal virgülle ayrılmış bir yöntemdir. Virgül, yalnızca programlama dillerinde değil, kitaplarda, gazetelerde ve genel olarak yazı dilinde de olağan sınırlayıcıdır.

Nesne Pascal'ın C'den farklı bir sözdizimi vardır, ancak sözdizimi aslında programcı için okumak KOLAYDIR (belki bilgisayar için değil, ancak bilgisayarın ne düşündüğü kimin umurunda). Yani belki konuya girdiler, ama en azından sonuçları daha iyi.

Python'un farklı bir sözdizimi vardır ve okuması (insanlar için) Pascal'dan daha kolaydır. Yani onu değiştirdiklerinde, farklı hale getirdiklerinde, en azından biz programcılar için daha iyi hale getirdiler.

Ve sonra ObjectiveC'ye sahibiz. C'ye bazı iyileştirmeler eklemek, ancak kendi arayüz sözdizimini, yöntem çağrısını, parametre geçişini ve ne olmadığını icat etmek. Merak ediyorum neden + ve - değiştirmediler ki bu artı iki sayıyı çıkarır. Daha da havalı olurdu.

Steve Jobs, ObjectiveC'yi destekleyerek batırdı. Elbette daha iyi olan ancak en kötü rakibine ait olan C # 'ı destekleyemez. Yani bu politik bir karar, pratik değil. Politik nedenlerle teknik kararlar alındığında teknoloji her zaman zarar görür. İyi yaptığı şirketi yönetmeli ve programlama konularını gerçek uzmanlara bırakmalıdır.

Eminim iOS yazmaya ve kitaplıkları ObjectiveC dışında herhangi bir dilde desteklemeye karar verirse iPhone için daha da fazla uygulama olurdu. Sıkı hayranlar, bakire programcılar ve Steve Jobs dışında herkese ObjectiveC gülünç, çirkin ve iğrenç görünüyor.


3
son 2 paragraf hepsini
özetliyor

Elbette sözdizimi saçma görünüyor, ancak Objective-C dilinin cevheri, tüm dillerin yansımasını kullanmak için neredeyse en kolay olanı ve birkaç paradigmayı neredeyse önemsiz hale getiren bazı gerçekten parlak çalışma zamanı özelliklerine sahip olmasıdır. Örneğin, Objective-C'yi kullanırken, hangi doğrusal tablonun kullanılacağına - bağlantılı liste ya da vektör ya da her neyse - sadece NSArrayve makineye ve verinin doğasına bağlı olarak en iyi algoritmanın seçimini gerçekleştirmesine asla gerek duymam.
Maxthon Chan

İlk işimi Objective-C'de iOS-App kullanıcı arayüzlerini uygulayan (bakire) bir programcı olarak girdim. Şimdilik tek istediğim (3 yıl sonra) o yalnız 'adadan' çıkmak ve daha platformdan bağımsız ve dolayısıyla daha ufuk açıcı bir şey öğrenmek. Ayrıca, diğer çerçevelerin de bu kadar hızlı ve hatalı olup olmadığını öğrenmek için. Hey! Yeni özellik! - Crash ... Umarım (alman) iş merkezi benim için Java ve / veya C ++ / C # eğitimlerine biraz para harcar, çünkü artık Apple sh * t için geliştirme yapmak istemiyorum.
anneblue

5

Object-c ile ilgili sevdiğim bir şey, nesne sisteminin mesajlara dayanıyor olması, C # ile yapamayacağınız gerçekten güzel şeyler yapmanıza izin vermesi (en azından dinamik anahtar kelimeyi destekleyene kadar!).

Kakao uygulamaları yazmanın bir başka harika yanı da Arayüz Oluşturucu, Visual Studio'daki form tasarımcısından çok daha iyi.

Obj-c ile ilgili beni rahatsız eden şeyler (bir C # geliştiricisi olarak), kendi hafızanızı yönetmeniz gerektiği gerçeğidir (çöp toplama vardır, ancak bu iPhone'da çalışmaz) ve bu nedenle çok ayrıntılı olabilir seçici sözdizimi ve tümü [].


2
dynamicsizi sadece yarısına götürür - mesaj yetkilendirme gibi önemsiz şeylerle bile gerçek bir dinamik nesne uygulamak C # 4.0'da bile sıkıcıdır. Öte yandan, bir la ObjC geçen esneklik gerçek dinamik mesajın bedeli kayıp tip emniyettir.
Pavel Minaev

3
Objective-C'nin, çok daha yüksek bir tür güvenliği sağlayan isteğe bağlı statik yazmaya izin verdiğini belirtmek gerekir. Bazı insanlar derleme zamanı kontrolünü tercih ederken, diğerleri çalışma zamanı kontrolünü tercih eder. Güzel olan (her iki dilde) seçimin mutlak olması gerekmemesidir.
Quinn Taylor

3
Windows Forms tasarımcısı o kadar iyi değil, ancak WPF'yi kullanabiliyorsanız (.NET 3.0'dan itibaren) İfade Karışımı'nı yenmek zordur ...
Nate

Bunu System.ReflectionC # 3.0'daki uzantılarla birleştirerek çok fazla yapabilirsiniz, bulduğunuz herhangi bir yöntemi çağırabilirsiniz, ancak gerçek mesaj geçişi değil, obj.PassMessage("function_name", params object[] args);dile entegre edilmiş daha iyi mesaj geçişi gibi görünecek , normal nesnede çağrılabilir olmayan yöntem gerekli.
Filip Kunc

4

C # 4.0'dan gelen iPhone için Objective-C ile yeni başlayan bir programcı olarak lambda ifadelerini ve özellikle de Linq-to-XML'i kaçırıyorum. Lambda ifadeleri C # -özeldir, Linq-to-XML ise gerçekten daha çok .NET ve Cocoa kontrastıdır. Yazdığım örnek bir uygulamada, bir dizede biraz XML vardı. Bu XML'nin öğelerini bir nesneler koleksiyonuna ayrıştırmak istedim.

Bunu Objective-C / Cocoa'da başarmak için NSXmlParser sınıfını kullanmam gerekiyordu . Bu sınıf, NSXMLParserDelegate protokolünü, bir öğe açık etiketi okunduğunda, bazı veriler okunduğunda (genellikle öğenin içinde) okunduğunda ve bazı öğe son etiketi okunduğunda çağrılan yöntemlerle (oku: mesajlar gönderildi) uygulayan başka bir nesneye dayanır. . Ayrıştırma durumunu ve durumunu takip etmelisiniz. Ve dürüst olmak gerekirse, XML geçersizse ne olacağı hakkında hiçbir fikrim yok. Ayrıntılara inmek ve performansı optimize etmek için harika, ama dostum, bu çok fazla kod.

Buna karşılık, burada C # kodudur:

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

İşte bu kadar, XML'den çizilmiş bir özel nesneler koleksiyonunuz var. Bu öğeleri değere göre veya yalnızca belirli bir özniteliği içerenlere göre filtrelemek istiyorsanız veya yalnızca ilk 5'i istiyorsanız veya ilk 1'i atlayıp sonraki 3'ü elde etmek veya herhangi bir öğenin döndürülüp döndürülmediğini öğrenmek istiyorsanız ... BAM, hepsi aynı kod satırında.

Bu işlemeyi Objective-C'de çok daha kolay hale getiren birçok açık kaynaklı sınıf vardır, bu yüzden ağır işlerin çoğunu yapar. Sadece bu yerleşik değil.

* NOT: Yukarıdaki kodu aslında derlemedim, sadece C # tarafından gerekli görülen göreli ayrıntı eksikliğini göstermek için bir örnek olması amaçlanmıştır.


Bununla birlikte, burada değil, bu karşılaştırmada C # kısmında çok fazla "ayrıntı eksikliği" olmaması, yalnızca ayrıntıların XML'nizi ayrıştırmak için kullandığınız .net çerçeve sınıflarında bulunması önemlidir. Bunların içindeki kodu incelerseniz, muhtemelen çok daha fazla C # kodu, muhtemelen daha da ayrıntılı bulursunuz.
XIVSolutions

3

Muhtemelen en önemli fark bellek yönetimidir. C # ile CLR tabanlı bir dil olması sayesinde çöp toplama elde edersiniz. Objective-C ile belleği kendiniz yönetmeniz gerekir.

C # arka planından (veya bu konuda herhangi bir modern dilden) geliyorsanız, otomatik bellek yönetimi olmayan bir dile geçmek gerçekten zahmetli olacaktır çünkü kodlama zamanınızın çoğunu belleği düzgün bir şekilde yönetmek (ve hata ayıklamak için) için harcayacaksınız. iyi).


6
ObjC bu günlerde çöp toplama izliyor. Öte yandan, C #, isterseniz hafızayı kendiniz yönetmenize izin verir (ham işaretçiler sayesinde).
Pavel Minaev

3
Objective-C'de (Apple'ın çerçeveleri bağlamında) manuel bellek yönetimini bir yük olarak görmüyorum: saklama / bırakma / otomatik bırakma döngüsü, C ve C ++ 'daki "geleneksel" bellek yönetiminden çok daha az külfetli.
mipadi

5
Bu doğru bir DSO değil - iPhone gibi çöp toplama olmayan bir ortamda bile, saklama / yayınlama ve otomatik yayınlama işlemlerinin öğrenilmesi yaklaşık 10 dakika sürer ve bu durumda sorun olmaz. Bellek yönetiminin zorluklarını abartmayı seven çok sayıda C # buldum. Neredeyse obj-c'yi çok fazla
sevmeye

4
Manuel bellek yönetiminin temelleri zor değil. Ancak, tahsis edilmiş nesneleri etrafta geçirmeye başladığınızda ve karmaşık nesne grafikleriyle uğraşmanız gerektiğinde, çok hızlı bir şekilde karmaşıklaşabilir, çünkü serbest bırakmaktan kimin ve ne zaman sorumlu olduğu konusunda kuralları dikkatlice izlemeniz gerekir. Referans sayma uygulamaları bunu biraz daha kolaylaştırır, ancak nesne grafiklerinde döngülerle uğraşmanız gerekir ... C # ile karşılaştırıldığında, tüm bu IMO büyük bir farktır.
DSO

1

İşte iki dili karşılaştıran oldukça güzel bir makale: http://www.coderetard.com/2008/03/16/c-vs-objective-c/


Sayfanın UTF-8'de olduğunu iddia etmesi üzücü, ancak kesme ve tırnak işaretleri için her türlü kötü ikame var. Sanırım metni "kıvrımlı" alıntılar kullanıyor, ama kesinlikle kodu karıştırıyorlar ...
Quinn Taylor

girişlerini bütün domuzlarını çalmış gibi görünüyorlar, ancak kaynak makalenin bile kodları ezilmiş. özellikle harika bir makale değil.
dnord

-2

2 dil arasındaki paradigma farkı dışında çok fazla fark yok. Söylemekten nefret etsem de, Objective-C ve Cocoa ile yapabildiğiniz gibi, .NET ve C # ile aynı tür şeyleri (muhtemelen o kadar kolay değil) yapabilirsiniz. Eğer kalmamak Leopard itibariyle Objective-C 2.0, çöp koleksiyonuna sahiptir var sen (eski Mac'ler ile kod uyumluluğu ve iPhone uygulamaları istediğiniz 2 nedeni vardır) istemedikçe belleği kendiniz yönetmek için.

Yapılandırılmış, okunabilir kod söz konusu olduğunda, buradaki yükün çoğu, diğer dillerde olduğu gibi programcıya aittir. Bununla birlikte, mesaj geçiş paradigmasının, işlevlerinizi / yöntemlerinizi uygun şekilde adlandırmanız koşuluyla (yine, diğer diller gibi) okunabilir koda uygun olduğunu görüyorum.

C # veya .NET ile pek aşina olmadığımı ilk kabul eden ben olacağım. Ancak Quinn'in yukarıda sıralanan nedenleri, benim öyle olmasını umursamadığım birkaç nedenden ötürü.


-3

Obj-c'de kullanılan yöntem çağrıları, bence c # 'dan çok daha zarif ve obj-c c'nin üzerine inşa edilmiştir, bu nedenle tüm c kodu obj-c'de düzgün çalışmalıdır. Benim için en büyük satıcı, obj-c'nin açık bir standart olması, böylece herhangi bir sistem için derleyiciler bulabilmeniz.


2
ISO C # ayrıca açık bir standarttır. Ayrıca, bildiğim kadarıyla, var olan tek ObjC derleyicisi gcc'dir.
Pavel Minaev

@Pavel: Taşınabilir Nesne Derleyicisi ( users.telenet.be/stes/compiler.html ) ve clang da var.
mipadi

1
Aslında, GCC artık tek derleyici değil - Clang ve LLVM, GCC'nin yerini almak ve JIT derlemesi de dahil olmak üzere asla yapamadığı şeyleri yapmak için tasarlanmış ve geliştirilmiş bir çift teknolojidir. Bu, Snow Leopard'daki OpenCL'nin özüdür. Ayrıca diğer dillere genişletilebilirler ve kontrol edilmeye değer.
Quinn Taylor

2
Dürüst olmak gerekirse taşınabilirliği Objective-C'nin bir uzmanı olarak görmüyorum. Aksine, güçlü yönler, aynı görevi gerçekleştirmek için hızlı gelişme ve azaltılmış kod hacmi doğrultusunda daha fazladır.
Quinn Taylor

Derleyici kullanılabilirliğiyle ilgili hatamı düzelttiğiniz için teşekkürler. Eh, taşınabilirlik teknik olarak zaten orada - örneğin Win32'de MinGW / ObjC'yi gayet iyi kullanabilirim - bu anlamda gcc'nin kendisi kadar taşınabilir. Tabii ki, kütüphaneler orada olmayacak (gerçi ... GnuStep / Win32 var mı?), Ama bu durum Mono ile yaptığımızdan çok daha kötü değil; Yani genel olarak, taşınabilirliğin her iki taraf için de güçlü bir nokta olmadığını söyleyebilirim.
Pavel Minaev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.