Jak wypada Objective-C w porównaniu z C #? [Zamknięte]

87

Niedawno kupiłem komputer Mac i używam go głównie do programowania w języku C # w ramach VMWare Fusion. Przy wszystkich fajnych aplikacjach na Maca zacząłem myśleć o Xcode czającym się po jednym kliknięciu instalacji i uczącym się Objective-C.

Składnia między tymi dwoma językami wygląda bardzo różnie, prawdopodobnie dlatego, że Objective-C ma swoje korzenie w C, a C # ma swoje korzenie w Javie / C ++. Ale można się nauczyć różnych składni, więc powinno być OK.

Moim głównym zmartwieniem jest praca z językiem i to, czy pomoże to stworzyć dobrze skonstruowany, czytelny i elegancki kod. Naprawdę lubię funkcje takie jak LINQ i var w C # i zastanawiam się, czy w Objective-C są odpowiedniki lub lepsze / różne funkcje.

Jakie funkcje językowe będę tęsknić za rozwijaniem w Objective-C? Jakie funkcje zyskam?

Edycja: Porównania ram są przydatne i interesujące, ale tak naprawdę to pytanie dotyczy porównania języków (częściowo moja wina, że ​​pierwotnie oznaczałem .net). Przypuszczalnie zarówno Cocoa, jak i .NET to bardzo rozbudowane frameworki same w sobie i oba mają swój cel - jeden jest przeznaczony dla Mac OS X, a drugi dla systemu Windows.

Dziękujemy za dotychczas przemyślane i rozsądnie wyważone punkty widzenia!

Alex Angas
źródło
27
Xcode nie jest doskonały, ale z pewnością ma wiele potężnych i przydatnych funkcji. Dyskredytowanie czegoś jako „czystego zła” bez poparcia lub podania kontekstu do porównania to FUD, który nikomu nie pomaga. W każdym razie nie ma to znaczenia dla pytania.
Quinn Taylor
11
Xcode 3.2 jest prawdopodobnie najlepszym IDE, jakiego kiedykolwiek używałem, z elegancką obsługą punktów przerwania, analizą statyczną, wbudowanymi komunikatami o błędach i mnóstwem innych funkcji. Przy okazji, to „Xcode”, a nie „XCode”. @Nathan, naprawdę nie rozumiem, dlaczego musisz oczerniać Xcode, nazywając go „czystym złem” - bez żadnego uzasadnienia - w dyskusji o językach.
PlagueHammer
6
Jedną wielką rzeczą, którą zyskasz używając Objective-C, jest to, że będziesz miał dostęp do frameworków Cocoa. Ponadto C, C #, Java i C ++ mają wspólne dziedzictwo składniowe. Objective-C pobiera swoją składnię z Smalltalk.
Amok
4
Pracujesz w C # używając fuzji VMWare? Po prostu użyj mono i monodevelop (która jest wersją open source platformy .NET i Visual Studio, która działa na komputerach Mac i Linux. Za pomocą Mono można również tworzyć aplikacje na komputery Mac i iPhone przy użyciu języka C #, jednocześnie korzystając z biblioteki .NET, a także Cocoa ...
Robin Heggelund Hansen
5
@ user668039 15 lat doświadczenia w używaniu C #? Został wydany w 2001 roku!
Ian Newson

Odpowiedzi:

89

Żaden język nie jest idealny do wszystkich zadań, a Objective-C nie jest wyjątkiem, ale są pewne bardzo specyficzne subtelności. Podobnie jak w przypadku używania LINQi var(dla których nie jestem świadomy bezpośredniego zastąpienia), niektóre z nich są ściśle związane z językiem, a inne są związane z frameworkiem.

( UWAGA: Tak jak C # jest ściśle powiązany z .NET, Objective-C jest ściśle powiązany z Cocoa. Dlatego niektóre z moich punktów mogą wydawać się niezwiązane z Objective-C, ale Objective-C bez Cocoa jest podobne do C # bez .NET / WPF / LINQ, działające w trybie Mono itp. To po prostu nie jest sposób, w jaki zwykle się to robi).

Nie będę udawać, że w pełni omawiam różnice, zalety i wady, ale oto kilka, które przychodzą mi do głowy.

  • Jedną z najlepszych części Objective-C jest dynamiczna natura - zamiast wywoływać metody, wysyłasz komunikaty, które środowisko wykonawcze kieruje dynamicznie. W połączeniu (rozsądnie) z dynamicznym pisaniem, może to uczynić wiele potężnych wzorców prostszymi lub nawet trywialnymi do wdrożenia.

  • Jako ścisły nadzbiór C, Objective-C ufa, że ​​wiesz, co robisz. W przeciwieństwie do podejścia zarządzanego i / lub bezpiecznego dla typów języków, takich jak C # i Java, Objective-C pozwala robić, co chcesz i doświadczać konsekwencji. Oczywiście czasami może to być niebezpieczne, ale fakt, że język nie przeszkadza aktywnie w robieniu większości rzeczy, jest dość potężny. ( EDIT: należy wyjaśnić, że C # posiada również „niebezpiecznych” cechy i funkcje, ale domyślne zachowanie jest zarządzany kod, który trzeba jawnie zrezygnować z porównania Java. Tylko pozwala na typesafe kodu i nie naraża surowych wskaźników w tak jak C i inni).

  • Kategorie (dodawanie / modyfikowanie metod w klasie bez podklas lub dostępu do źródła) to niesamowity miecz obosieczny. Może znacznie uprościć hierarchie dziedziczenia i wyeliminować kod, ale jeśli zrobisz coś dziwnego, wyniki mogą czasami być zaskakujące.

  • Cocoa sprawia, że ​​tworzenie aplikacji GUI jest o wiele prostsze na wiele sposobów, ale musisz ogarnąć ten paradygmat. Projekt MVC jest wszechobecny w kakao, a wzorce, takie jak delegaci, powiadomienia i wielowątkowe aplikacje GUI, są dobrze dopasowane do Objective-C.

  • Wiązania Cocoa i obserwacja klucz-wartość mogą wyeliminować mnóstwo kodu kleju, a struktury Cocoa w dużym stopniu to wykorzystują. Dynamiczne wysyłanie Objective-C działa ręka w rękę z tym, więc typ obiektu nie ma znaczenia, o ile jest zgodny z kluczem-wartością.

  • Prawdopodobnie przegapisz typy generyczne i przestrzenie nazw, i mają one swoje zalety, ale w podejściu i paradygmacie Objective-C byłyby bardziej subtelne niż konieczne. (Generics dotyczy bezpieczeństwa typów i unikania rzutowania, ale dynamiczne pisanie w Objective-C sprawia, że ​​zasadniczo nie stanowi to problemu. Przestrzenie nazw byłyby fajne, gdyby były dobrze wykonane, ale jest wystarczająco proste, aby uniknąć konfliktów, których koszt prawdopodobnie przewyższa korzyści, zwłaszcza dla starszego kodu).

  • W przypadku współbieżności bardzo przydatne są bloki (nowa funkcja językowa w Snow Leopard, zaimplementowana w dziesiątkach interfejsów API Cocoa). Kilka wierszy (często w połączeniu z Grand Central Dispatch, który jest częścią libsystem w wersji 10.6) może wyeliminować znaczący schemat funkcji wywołania zwrotnego, kontekstu itp. (Bloki mogą być również używane w C i C ++ i na pewno można je dodać do C #, co byłoby niesamowite.) NSOperationQueue jest również bardzo wygodnym sposobem dodawania współbieżności do własnego kodu, wysyłając niestandardowe podklasy NSOperation lub anonimowe bloki, które GCD automatycznie wykonuje w jednym lub kilku różnych wątkach.

Quinn Taylor
źródło
7
Technicznie, C # posiada wszelką moc non-type-safe funkcje, które ObjC robi: surowe wskaźniki, wskaźnik arytmetyka, związany-niesprawdzonych tablice, związki, alloca. Po prostu nie czyni ich tak łatwo dostępnymi - musisz wyraźnie wyrazić zgodę.
Pavel Minaev
8
Po prostu wspominam o kakao, ponieważ większość atrakcyjności programowania w Objective-C wynika z frameworków Cocoa. Czy C # byłby interesujący bez .NET i / lub WPF? Pytający konkretnie wspomniał o LINQ, więc oczywiście patrzy poza język, na doświadczenie.
Quinn Taylor
7
Co jest w porządku. Nie próbuję rozpocząć walki z C #. Gdybym miał pisać oprogramowanie dla Windows, tego bym użył. Po prostu próbuję wskazać podobieństwa i różnice między językami i powiązanymi narzędziami. Jesteś oczywiście bardziej doświadczony w C #, a ja z Objective-C. Doceniam twoje wyjaśnienia, ale być może bardziej konstruktywne odpowiedzi i mniej rozdwajania włosów będą najbardziej przydatne.
Quinn Taylor
11
To nie powoduje rozdwajania włosów, Quinn. Zwróciłem tylko uwagę, że to, co zaczęło się od porównania języków, w pewnym momencie twojej odpowiedzi przerodziło się w ogólną dyskusję na temat tego, jak dobre jest kakao. Nadal chciałbym zwrócić uwagę, że twoje punkty na temat kakao nie są porównaniami - mówią "robi X dobrze" - i może tak być - ale nie mówią "robi X lepiej / gorzej niż C # + WPF ”, o co ogólnie chodzi w pytaniu.
Pavel Minaev
6
+1 doskonała odpowiedź Quinn
h4xxr
54

Programuję w C, C ++ i C # już od ponad 20 lat, po raz pierwszy zacząłem w 1990 roku. Właśnie postanowiłem rzucić okiem na rozwój iPhone'a oraz Xcode i Objective-C. O mój Boże ... wszystkie skargi na Microsoft, które cofam, teraz zdaję sobie sprawę, jak zły był kod. Cel-C jest zbyt złożony w porównaniu z tym, co robi C #. Byłem zepsuty językiem C # i teraz doceniam całą ciężką pracę włożoną przez Microsoft. Samo odczytanie Objective-C z wywołaniami metod jest trudne do odczytania. C # jest w tym elegancki. To tylko moja opinia, miałem nadzieję, że język programowania Apple był tak dobry, jak produkty Apple, ale droga mi, muszą się wiele nauczyć od Microsoftu. Nie ma wątpliwości, aplikacja w C # .NET Mogę uruchomić aplikację wielokrotnie szybciej niż XCode Objective-C. Apple z pewnością powinno wyciągnąć kartkę z książki Microsoftu, a wtedy mielibyśmy idealne środowisko. :-)

Waz
źródło
47
Nawet jeśli spojrzałeś na książkę deweloperską na iPhone'a, nadal jesteś w stanie szybciej stworzyć aplikację na platformie, na której masz 20 lat doświadczenia? NIESAMOWITY
kubi
25
Mam dokładnie to samo doświadczenie co Waz. Jestem również znacznie bardziej wdzięczny za pracę, którą Microsoft włożył w C # i narzędzia programistyczne, takie jak Visual Studio, po tym, jak zacząłem uczyć się Celu C.
René
4
Takie też było moje doświadczenie podczas studiowania obiektywnego c, nadmierna złożoność w porównaniu z c #. @ alexy13 Którą część c i c ++ z oryginalnej wiadomości przegapiłeś? Posiadanie dziesięcioleci doświadczenia w jednej rodzinie języków pomaga LOT-owi ocenić, jak trudno jest wykonywać tę samą pracę z innym językiem z tej samej rodziny.
Anderson Fortaleza,
5
jaka jest ta najlepsza odpowiedź? Nie jest to odpowiedź zwięzłe, tylko wyraźnie tendencyjne opinią jakiegoś języka nauczył noc vs języku, który został przy użyciu ponad 20 lat ... oczywiście, że nie będzie tak sprawny na nowego języka
Heavy_Bullets
3
"Just reading Objective-C with method invokes is difficult to read"- oto tylko jeden bardzo subiektywny argument, który został tutaj wymieniony jako wady Obj-C. Wszystko inne to tylko dyskusyjna retoryka.
Skywinder
46

Nie ma tu przeglądu technicznego, ale po prostu uważam, że Objective-C jest znacznie mniej czytelny. Biorąc pod uwagę przykład, który dał ci Cinder6:

DO#

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)

Cel C

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

Wygląda okropnie. Próbowałem nawet przeczytać 2 książki na ten temat, zgubili mnie wcześnie i zwykle nie rozumiem tego z książkami / językami programowania.

Cieszę się, że mamy Mono dla Mac OS, ponieważ gdybym musiał polegać na Apple, aby zapewnić mi dobre środowisko programistyczne ...

Timothy P.
źródło
17
Ignorując fakt, że pierwsza linia powinna kończyć się [NSMutableArray array]zamiast tego (przecieka pamięć), a czwarta linia powinna zaczynać się od NSString* xor id x(błąd kompilacji) ... Tak, w Objective-C brakuje typów generycznych (szczerze nie brakuje mi ich), nie 't indeksuje obiekty ze składnią tablicową, a interfejsy API są generalnie bardziej szczegółowe. To-may-to, to-mah-to. To naprawdę sprowadza się do tego, co wolisz zobaczyć. (Możesz napisać ten sam kod w C ++ STL i pomyślałem, że byłby ohydny). Dla mnie czytelny kod często oznacza, że ​​tekst kodu mówi ci, co robi, a zatem kod Objective-C jest preferowany.
Quinn Taylor
18
Tak naprawdę nie widzę nic złego w składni jako takiej - głównym powodem, dla którego wydaje się mniej czytelna, jest to, że 1) jest nieznany każdemu, kto pochodzi z tła C, i 2) jest używany w środku zwykłych konstrukcji C, gdzie jest wygląda obco. Z drugiej strony Smalltalkish nazwane parametry jako część nazwy metody w rzeczywistości sprawia, że ​​wywołania są bardziej zrozumiałe od samego początku. W rzeczywistości przykładowy kod C # dobrze to demonstruje - nie skompiluje się, ponieważ List<T>.Removeprzyjmuje ciąg jako argument i usuwa pierwsze wystąpienie tego ciągu. Aby usunąć według indeksu, potrzebujesz RemoveAt.
Pavel Minaev
12
... mając na uwadze, że wersja ObjC z removeObjectAtIndex:, choć bardziej szczegółowa, jest również jednoznaczna co do tego, co robi.
Pavel Minaev
6
Doskonałe punkty, Pavel. Ponadto niespójność między strings[0]i strings.RemoveAt(0)zmniejsza jasność, przynajmniej dla mnie. (Poza tym zawsze denerwuje mnie, gdy nazwy metod zaczynają się wielką literą ... Wiem, że to drobny drobiazg, ale to po prostu dziwne.)
Quinn Taylor
4
W moim przypadku, jak dla wielu osób, czytelność „narzędzia” wpływa na moją produktywność. Jestem wygodny i produktywny z wieloma językami, jednak Objective-C nigdy nie był jednym z nich i nie wynika to z braku prób. Ale pod koniec dnia wszystko zależy od osobistych preferencji. W przeciwieństwie do 20 lat temu, nie jesteś zmuszony używać języka X, aby kierować reklamy na platformę Y. Wybierasz to, co najbardziej Ci odpowiada.
TimothyP,
17

Ręczne zarządzanie pamięcią jest czymś, z czym początkujący, dla Objective-C, mają najwięcej problemów, głównie dlatego, że uważają, że jest to bardziej złożone niż jest.

Cel C i kakao w rozszerzeniu opierają się na konwencjach dotyczących egzekwowania; znasz i przestrzegasz bardzo małego zestawu reguł, a dzięki dynamicznemu środowisku wykonawczemu dostajesz dużo za darmo.

Nie w 100% prawdziwa zasada, ale wystarczająco dobra na co dzień to:

  • Każde wywołanie funkcji allocpowinno być połączone z a releasena końcu bieżącego zakresu.
  • Jeśli wartość zwracana dla Twojej metody została uzyskana do alloc, powinna zostać zwrócona przez return [value autorelease];zamiast dopasowywania przez release.
  • Użyj właściwości i nie ma trzeciej reguły.

Dalej następuje dłuższe wyjaśnienie.

Zarządzanie pamięcią opiera się na własności; tylko właściciel instancji obiektu powinien kiedykolwiek zwolnić obiekt, wszyscy inni powinni zawsze nic nie robić. Oznacza to, że w 95% całego kodu traktujesz Objective-C tak, jakby był wyrzucany jako śmieci.

A co z pozostałymi 5%? Masz trzy metody, na które należy zwrócić uwagę, każda instancja obiektu otrzymana z tych metod jest własnością bieżącego zakresu metody :

  • alloc
  • Dowolna metoda rozpoczynająca się od słowa nowy , na przykład newlub newService.
  • Dowolna metoda zawierająca kopię słowa, na przykład copyi mutableCopy.

Metoda ma trzy możliwe opcje dotyczące tego, co zrobić z instancjami należącymi do jej obiektów przed zakończeniem działania:

  • Zwolnij go, używając, releasejeśli nie jest już potrzebny.
  • Przyznaj własność pola a (zmiennej instancji) lub zmiennej globalnej, po prostu przypisując ją.
  • Porzuć własność, ale daj komuś szansę przejęcia własności, zanim instancja zniknie, dzwoniąc autorelease.

Kiedy więc powinieneś aktywnie przejąć własność dzwoniąc retain? Dwie sprawy:

  • Podczas przypisywania pól w inicjatorach.
  • Podczas ręcznego wdrażania metody ustawiającej.
PeyloW
źródło
2
+1 Doskonałe podsumowanie. Brzmi bardzo podobnie do tego, kiedy nauczyłem się C lata temu.
Alex Angas
4
Dla wyjaśnienia, czyszczenie pamięci jest w pełni obsługiwane dla Objective-C na Macu i nie ma potrzeby wykonywania żadnego ręcznego zarządzania pamięcią. Ręczne zarządzanie pamięcią jest wymagane tylko w systemie iOS.
PlagueHammer
3
Mimo to dobrze jest nauczyć się podstaw zarządzania pamięcią, choćby po to, aby poprawić wydajność, gdy jest to potrzebne (nie trzeba uruchamiać czyszczenia pamięci).
FeifanZ
3
iOS 5 wprowadził ARC, eliminując konieczność ręcznego zwalniania przydzielonego obiektu. Ale wciąż nie jest to tak łatwe jak C #. Musisz pamiętać, że Objective-C ma ponad 20 lat i zachował niektóre wymagania języków z tamtych czasów: to znaczy wiedzieć, kiedy przydzielić, a kiedy zwolnić / zwolnić pamięć. C # usunął to wszystko dla Ciebie. To powiedziawszy, Cocoa ma wiele interfejsów API, które nie są jeszcze dostępne w systemie Windows Phone. Takie jak gesty, znacznie więcej kontroli, jeśli chodzi o zdarzenia interfejsu użytkownika itp ...
jyavenard
10

Jasne, jeśli wszystko, co widziałeś w swoim życiu, jest celem C, to jego składnia wygląda na jedyną możliwą. Moglibyśmy nazwać cię „dziewicą programowania”.

Ale ponieważ dużo kodu jest napisanych w C, C ++, Java, JavaScript, Pascal i innych językach, zobaczysz, że ObjectiveC różni się od nich wszystkich, ale nie w dobry sposób. Czy mieli ku temu powód? Zobaczmy inne popularne języki:

C ++ dodał wiele dodatków do C, ale zmienił oryginalną składnię tylko w razie potrzeby.

C # dodał wiele dodatków w porównaniu do C ++, ale zmienił tylko rzeczy, które były brzydkie w C ++ (jak usunięcie „::” z interfejsu).

Java zmieniła wiele rzeczy, ale zachowała znajomą składnię z wyjątkiem części, w których zmiana była potrzebna.

JavaScript jest całkowicie dynamicznym językiem, który może zrobić wiele rzeczy, których ObjectiveC nie może. Jednak jego twórcy nie wymyślili nowego sposobu wywoływania metod i przekazywania parametrów tylko po to, by różniły się od reszty świata.

Visual Basic może przekazywać parametry poza kolejnością, podobnie jak ObjectiveC. Możesz nazwać parametry, ale możesz też przekazać je w zwykły sposób. Cokolwiek używasz, jest to normalny sposób rozdzielania przecinkami, który wszyscy rozumieją. Przecinek jest zwykłym ogranicznikiem, nie tylko w językach programowania, ale w książkach, gazetach i ogólnie w języku pisanym.

Object Pascal ma inną składnię niż C, ale jego składnia jest w rzeczywistości ŁATWIEJSZA dla programisty (może nie dla komputera, ale kogo to obchodzi, co myśli komputer). Może więc odeszli, ale przynajmniej ich wynik jest lepszy.

Python ma inną składnię, która jest jeszcze łatwiejsza do odczytania (dla ludzi) niż Pascal. Więc kiedy go zmienili, zmieniając, przynajmniej uczynili to lepszym dla nas, programistów.

A potem mamy ObjectiveC. Dodanie pewnych ulepszeń do C, ale wymyślenie własnej składni interfejsu, wywoływanie metod, przekazywanie parametrów i co nie. Zastanawiam się, dlaczego nie zamienili + i - tak, że plus odejmuje dwie liczby. Byłoby jeszcze fajniej.

Steve Jobs spieprzył, wspierając ObjectiveC. Oczywiście nie obsługuje C #, co jest lepsze, ale należy do jego najgorszego konkurenta. Jest to więc decyzja polityczna, a nie praktyczna. Technologia zawsze cierpi, gdy decyzje techniczne są podejmowane z powodów politycznych. Powinien kierować firmą, którą robi dobrze, a sprawy programistyczne pozostawić prawdziwym ekspertom.

Jestem pewien, że byłoby jeszcze więcej aplikacji na iPhone'a, gdyby zdecydował się napisać iOS i obsługiwać biblioteki w jakimkolwiek innym języku niż ObjectiveC. Dla wszystkich oprócz zagorzałych fanów, dziewiczych programistów i Steve'a Jobsa, ObjectiveC wygląda śmiesznie, brzydko i odrażająco.

user561168
źródło
3
ostatnie 2 akapity podsumowują wszystko
Zakos,
O tak, na pewno składnia wygląda absurdalnie, ale klejnotem języka Objective-C jest to, że ma prawie najłatwiejsze w użyciu odbicie ze wszystkich języków i kilka naprawdę genialnych funkcji środowiska uruchomieniowego, które sprawiają, że kilka paradygmatów jest prawie banalnych do wdrożenia. Na przykład, kiedy używam Objective-C, nigdy nie muszę się zastanawiać, której tabeli liniowej użyć - połączonej listy lub wektora, czy cokolwiek to jest - NSArrayi obsługuje on wybór najlepszego algorytmu na podstawie maszyny i natury danych.
Maxthon Chan,
Rozpocząłem swoją pierwszą pracę jako (dziewiczy) programista wdrażający interfejsy użytkownika iOS-App w Objective-C. Na razie (po 3 latach) chcę tylko opuścić tę samotną „wyspę” i nauczyć się czegoś bardziej niezależnego od platformy, a zatem bardziej nowatorskiego. Aby dowiedzieć się, czy inne frameworki są również aktualizowane tak szybko - i zawierają błędy. Hej! Nowa cecha! - Crash ... Mam nadzieję, że (niemieckie) biuro pracy wyda dla mnie trochę pieniędzy na samouczki w Javie i / lub C ++ / C #, ponieważ nie chcę już tworzyć dla Apple sh * t.
anneblue
5

Jedną z rzeczy, które uwielbiam w Objective-c, jest to, że system obiektowy jest oparty na komunikatach, pozwala robić naprawdę fajne rzeczy, których nie można było zrobić w C # (przynajmniej nie dopóki nie obsługują dynamicznego słowa kluczowego!).

Kolejną świetną rzeczą w pisaniu aplikacji cocoa jest Interface Builder, jest o wiele ładniejszy niż projektant formularzy w Visual Studio.

Rzeczy związane z obj-c, które mnie denerwują (jako programistę C #) to fakt, że musisz zarządzać własną pamięcią (jest zbieranie śmieci, ale to nie działa na iPhonie) i może być bardzo rozwlekłe z powodu składnia selektora i wszystkie [].

jonnii
źródło
2
dynamicdostaniesz tylko w połowie - implementacja prawdziwego dynamicznego obiektu, nawet w przypadku błahych rzeczy, takich jak delegowanie wiadomości, jest żmudna nawet w C # 4.0. Z drugiej strony ceną za elastyczność prawdziwie dynamicznego przekazu przekazującego a la ObjC jest utrata bezpieczeństwa typu.
Pavel Minaev
3
Warto zauważyć, że Objective-C umożliwia opt-in statyczne wpisywanie, co zapewnia znacznie większy stopień bezpieczeństwa typów. Niektórzy wolą sprawdzanie w czasie kompilacji, inni wolą sprawdzanie w czasie wykonywania. Fajną rzeczą (w obu językach) jest to, że wybór nie musi być absolutny.
Quinn Taylor
3
Projektant Windows Forms nie jest taki świetny, ale jeśli potrafisz korzystać z WPF (od .NET 3.0) Expression Blend jest trudny do pokonania ...
Nate
Możesz wiele tego zrobić w System.Reflectionpołączeniu z rozszerzeniami w C # 3.0, możesz wywołać dowolną metodę, którą znajdziesz, ale nie jest to prawdziwe przekazywanie wiadomości, będzie wyglądać tak, obj.PassMessage("function_name", params object[] args);aby lepsze przekazywanie wiadomości było zintegrowane z językiem, brak metody wywoływanej na normalnym obiekcie byłoby potrzebne.
Filip Kunc,
4

Jako programista dopiero zaczynający pracę z Objective-C na iPhone'a, pochodzący z C # 4.0, brakuje mi wyrażeń lambda, a zwłaszcza Linq-to-XML. Wyrażenia lambda są specyficzne dla C #, podczas gdy Linq-to-XML jest w rzeczywistości bardziej kontrastem .NET vs. Cocoa. W przykładowej aplikacji, którą pisałem, miałem trochę XML w ciągu. Chciałem przeanalizować elementy tego XML-a w kolekcję obiektów.

Aby to osiągnąć w Objective-C / Cocoa, musiałem użyć klasy NSXmlParser . Ta klasa opiera się na innym obiekcie, który implementuje protokół NSXMLParserDelegate z metodami, które są wywoływane (odczyt: wysłane wiadomości), gdy czytany jest otwarty tag elementu, gdy czytane są dane (zwykle wewnątrz elementu) i gdy czytany jest znacznik końcowy elementu . Musisz śledzić stan i stan analizowania. I szczerze mówiąc, nie mam pojęcia, co się stanie, jeśli XML jest nieprawidłowy. Świetnie nadaje się do zagłębiania się w szczegóły i optymalizacji wydajności, ale o rany, to cała masa kodu.

W przeciwieństwie do tego, oto kod w C #:

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

I to wszystko, masz kolekcję niestandardowych obiektów narysowanych z XML. Jeśli chcesz odfiltrować te elementy według wartości, lub tylko do tych, które zawierają określony atrybut, lub jeśli chcesz tylko pierwszych 5, lub jeśli chcesz pominąć pierwszy 1 i uzyskać następne 3, lub po prostu dowiedzieć się, czy jakiekolwiek elementy zostały zwrócone ... BAM, wszystko w tym samym wierszu kodu.

Istnieje wiele klas open-source, które znacznie ułatwiają to przetwarzanie w Objective-C, więc to robi większość ciężkiego podnoszenia. Po prostu nie jest to wbudowane.

* UWAGA: W rzeczywistości nie skompilowałem powyższego kodu, ma on służyć jako przykład ilustrujący względny brak szczegółowości wymaganej przez C #.

brentlightsey
źródło
Ważne jest jednak, aby nie tutaj jednak, że nie ma w tym porównaniu „braku gadatliwości” ze strony C #, a jedynie, że szczegółowość jest zawarta w klasach frameworka .net, których używasz do analizowania XML. Jeśli przyjrzysz się zawartemu w nich kodowi, prawdopodobnie znajdziesz dużo więcej kodu C #, być może nawet bardziej rozwlekły.
XIVSolutions
3

Prawdopodobnie najważniejszą różnicą jest zarządzanie pamięcią. Dzięki C # uzyskujesz wyrzucanie elementów bezużytecznych, ponieważ jest to język oparty na CLR. Z Objective-C musisz samodzielnie zarządzać pamięcią.

Jeśli wywodzisz się z języka C # (lub dowolnego współczesnego języka), przejście na język bez automatycznego zarządzania pamięcią będzie naprawdę bolesne, ponieważ spędzisz dużo czasu na kodowaniu na odpowiednim zarządzaniu pamięcią (i debugowaniu jako dobrze).

DSO
źródło
6
Obecnie ObjC śledzi wyrzucanie elementów bezużytecznych. Z drugiej strony C # pozwala samodzielnie zarządzać pamięcią, jeśli chcesz (dzięki surowym wskaźnikom).
Pavel Minaev
3
Nie uważam, aby ręczne zarządzanie pamięcią w Objective-C (w kontekście frameworków Apple) było dużym obciążeniem: cykl utrzymania / wydania / autorelease jest znacznie mniej kłopotliwy niż „tradycyjne” zarządzanie pamięcią w C i C ++.
mipadi
5
To po prostu nie jest prawdą DSO - nawet w środowisku nie-śmieciowym, takim jak iPhone, nauka zachowywania / zwalniania i automatycznego zwalniania zajmuje około 10 minut, a wtedy nie stanowi to problemu. Znalazłem wielu programistów C #, którzy lubią wyolbrzymiać wyzwania związane z zarządzaniem pamięcią. To prawie tak, jakby się obawiali, że inaczej zaczną lubić obj-c za bardzo ...;)
h4xxr
4
Podstawy ręcznego zarządzania pamięcią nie są trudne. Ale może się to bardzo szybko skomplikować, gdy zaczniesz przekazywać przydzielone obiekty i musisz poradzić sobie ze złożonymi grafami obiektów, ponieważ musisz uważnie przestrzegać reguł, które są odpowiedzialne za zwalnianie i kiedy. Implementacje liczenia referencji sprawiają, że jest to nieco łatwiejsze, z wyjątkiem tego, że musisz radzić sobie z cyklami w grafach obiektów ... w porównaniu do C #, cała ta IMO to duża różnica.
DSO
1

Oto całkiem dobry artykuł porównujący te dwa języki: http://www.coderetard.com/2008/03/16/c-vs-objective-c/

Żużel 6
źródło
Szkoda, że ​​strona twierdzi, że jest w UTF-8, ale ma wiele paskudnych zamienników apostrofów i cudzysłowów. Myślę, że w jego tekście użyto „zakrzywionych” cytatów, ale z pewnością zniekształcają kod ...
Quinn Taylor
Wygląda na to, że ukradli całe swoje intro, ale nawet artykuł źródłowy ma uszkodzony kod. nie jest też szczególnie dobrym artykułem.
dnord
-2

Poza różnicą paradygmatu między dwoma językami, nie ma dużej różnicy. Chociaż nie chcę tego mówić, możesz robić te same rzeczy (prawdopodobnie nie tak łatwo) z .NET i C #, jak z Objective-C i Cocoa. Począwszy od Leoparda, Objective-C 2.0 ma funkcję zbierania śmieci, więc nie musisz samodzielnie zarządzać pamięcią, chyba że chcesz (zgodność kodu ze starszymi aplikacjami na komputery Mac i iPhone to 2 powody, aby chcieć).

Jeśli chodzi o uporządkowany, czytelny kod, znaczna część jego obciążenia spoczywa na programistach, tak jak w przypadku każdego innego języka. Jednak uważam, że paradygmat przekazywania wiadomości dobrze nadaje się do czytelnego kodu, pod warunkiem, że odpowiednio nazwiesz swoje funkcje / metody (ponownie, tak jak każdy inny język).

Jako pierwszy przyznam, że niezbyt dobrze znam C # czy .NET. Ale powody, dla których Quinn wymieniony powyżej, to kilka powodów, dla których nie chcę się takim stać.

alesplin
źródło
-3

Wywołania metody użyte w obj-c make do łatwego odczytu kodu, moim zdaniem o wiele bardziej eleganckie niż c # i obj-c jest zbudowane na podstawie c, więc cały kod c powinien działać dobrze w obj-c. Największym sprzedawcą jest jednak to, że obj-c to otwarty standard, więc możesz znaleźć kompilatory dla dowolnego systemu.

kubi
źródło
2
ISO C # jest również otwartym standardem. O ile wiem, jedynym istniejącym kompilatorem ObjC jest gcc.
Pavel Minaev
@Pavel: Jest też Portable Object Compiler ( users.telenet.be/stes/compiler.html ) i clang.
mipadi
1
W rzeczywistości GCC nie jest już jedynym kompilatorem - Clang i LLVM to para technologii zaprojektowanych i opracowanych w celu zastąpienia GCC i robienia rzeczy, których nigdy nie mógł, w tym kompilacji JIT. Jest to rdzeń OpenCL w Snow Leopard. Można je również rozszerzyć na inne języki i warto je sprawdzić.
Quinn Taylor
2
Szczerze mówiąc, nie uważałbym, że przenośność jest zaletą Objective-C. Przeciwnie, mocne strony są bardziej podobne do szybkiego rozwoju i zmniejszonej ilości kodu w celu wykonania tego samego zadania.
Quinn Taylor
Dzięki za poprawienie mojego błędu dotyczącego dostępności kompilatora. Cóż, technicznie rzecz biorąc, przenośność i tak istnieje - mogę na przykład dobrze używać MinGW / ObjC na Win32 - w tym sensie jest tak samo przenośny jak samo gcc. Oczywiście bibliotek tam nie będzie (chociaż ... czy jest GnuStep / Win32?), Ale ta sytuacja nie jest dużo gorsza niż ta, którą mamy z Mono; więc ogólnie rzecz biorąc, powiedziałbym, że przenośność nie jest mocną stroną żadnej ze stron.
Pavel Minaev