Naucz się C, zanim nauczysz się Objective-C [zamknięte]


107

Będąc początkującym programistą Apple, chcę poznać opinie społeczności, czy lepiej najpierw nauczyć się języka C przed przejściem na Objective-C i ostatecznie na Cocoa Framework?

Moje przeczucie mówi, że naucz się C, co da mi dobrą podstawę.

Odpowiedzi:


163

Najpierw nauczyłbym się C. Nauczyłem się C (i dużo zrobiłem w C) przed przejściem do Obj-C. Mam wielu kolegów, którzy nigdy nie byli prawdziwymi programistami C, zaczynali od Obj-C i nauczyli się tylko tyle C, ile było to konieczne.

Od czasu do czasu widzę, jak rozwiązują problem całkowicie w Obj-C, co czasami prowadzi do bardzo niezdarnych rozwiązań. Zwykle potem zastępuję część kodu Obj-C czystym kodem C (w końcu możesz je mieszać tak często, jak chcesz, zawartość metody Obj-C może być całkowicie czystym kodem C). Bez zamiaru obrażania programisty Obj-C, istnieją rozwiązania, które są bardzo eleganckie w Obj-C, są to rozwiązania, które po prostu działają (i wyglądają) dużo lepiej dzięki obiektom(Programowanie OOP może uczynić złożone programy znacznie piękniejszymi niż programowanie funkcjonalne; na przykład polimorfizm jest genialną funkcją) ... i naprawdę lubię Obj-C (znacznie bardziej niż C ++! Nienawidzę składni C ++, a niektóre funkcje językowe są po prostu przesadą i prowadzą do złych wzorców rozwoju IMHO); jednak, gdy czasami ponownie piszę kod Obj-C moich kolegów (i naprawdę robię to tylko wtedy, gdy uważam, że jest to absolutnie konieczne), wynikowy kod jest zwykle o 50% mniejszy, potrzebuje tylko 25% pamięci, której używał wcześniej i jest około 400% szybszy w czasie wykonywania.

Co próbuję tutaj powiedzieć: każdy język ma swoje wady i zalety. C ma zalety i wady, podobnie jak Obj-C. Jednak naprawdę wspaniałą cechą Obj-C (dlatego nawet lubię go bardziej niż Java) jest to, że możesz przeskoczyć do zwykłego C do woli i z powrotem. Dlaczego to taka wspaniała funkcja? Ponieważ tak jak Obj-C naprawia wiele wad czystego C, czyste C może naprawić niektóre z wad Obj-C. Jeśli połączysz je razem, otrzymasz bardzo potężny zespół.

Jeśli uczysz się tylko Obj-C i nie masz pojęcia o C lub znasz tylko jego podstawy i nigdy nie próbowałeś w elegancki sposób rozwiązać niektórych typowych problemów, tak naprawdę nauczyłeś się tylko połowy Obj-C. C jest podstawową częścią Obj-C. Możliwość używania języka C w dowolnym czasie i wszędzie jest jego podstawową cechą.

Typowym przykładem był kod, którego użyliśmy, który musiał zakodować dane w base64, ale nie mogliśmy do tego użyć zewnętrznej biblioteki (brak biblioteki OpenSSL). Użyliśmy kodera base64, w całości napisanego przy użyciu klas Cocoa. Działało dobrze, ale kiedy zakodowaliśmy 200 MB danych binarnych, zajęło to wieczność, a narzut pamięci był nie do przyjęcia. Zastąpiłem go małym, ultra kompaktowym koderem base64 napisanym w całości jako jedna funkcja C (skopiowałem treść funkcji do treści metody, metoda przyjęła NSData jako dane wejściowe i zwróciła NSString jako wyjście, jednak wewnątrz funkcji wszystko było w C). Koder C był o wiele bardziej kompaktowy, pokonał koder czystego Cocoa o współczynnik 8 pod względem szybkości, a narzut pamięci był również znacznie mniejszy. Kodowanie / dekodowanie danych, zabawa z bitami i podobne zadania niskiego poziomu to tylko mocne strony C.

Innym przykładem był kod interfejsu użytkownika, który rysował wiele wykresów. Do przechowywania danych niezbędnych do malowania wykresów użyliśmy NSArray. Właściwie NSMutableArray's, ponieważ wykres był animowany. Wynik: bardzo powolna animacja wykresu. Zastąpiliśmy wszystkie NSArray zwykłymi tablicami C, obiektami ze strukturami (w końcu informacje o współrzędnych wykresu to nic, czego nie musisz mieć w obiektach), dostęp do modułu wyliczającego prostymi pętlami for i zaczęliśmy przenosić dane między tablicami za pomocą memcopy zamiast pobierać dane z jednej tablicy do drugi, indeks dla indeksu. Rezultat: czterokrotne przyspieszenie Wykres animowany płynnie, nawet w starszych systemach PPC.

Wadą C jest to, że każdy bardziej złożony program staje się brzydki na dłuższą metę. Utrzymanie czytelności, możliwości rozbudowy i zarządzania aplikacjami C wymaga dużej dyscypliny programisty. Wiele projektów kończy się niepowodzeniem, ponieważ brakuje tej dyscypliny. Obj-C ułatwia tworzenie struktury aplikacji przy użyciu klas, dziedziczenia, protokołów i tak dalej. To powiedziawszy, nie użyłbym czystej funkcjonalności C poza granicami metody, chyba że jest to konieczne. Wolę trzymać cały kod w aplikacji Objective-C w ramach metody obiektu; wszystko inne przeczy celowi aplikacji OO. Jednak w ramach metody czasami używam wyłącznie czystego C.


a jeśli znam już C ++ i chcę się uczyć Objective-C dla rozwoju iPhone / iTouch, czy muszę uczyć się C czegokolwiek?
chester89

11
@ chester89: jeśli znasz już C ++, wiesz wystarczająco dużo o C, aby rozpocząć pracę z Objective-C.
Sven

Sven ma rację, C ++ jest tak złożony i już używa tak dużo czystego C, jeśli znasz C ++ naprawdę dobrze, powinieneś również znać C wystarczająco dobrze.
Mecki

To moja ulubiona refleksja na ten temat, dziękuję.
Morkrom,

1
@FrederikWitte Pomiń C ++, tylko zmyli Cię jako początkującego (i nie jest to język, którego potrzebujesz do programowania mobilnego). Zacznij od Javy, jest to dobry język do nauczania, a sama znajomość Javy wystarczy do programowania na Androida (może chyba, że ​​chcesz pisać gry lub odtwarzacze wideo). Następnie naucz się C i wreszcie Obj-C, chyba że chcesz pominąć to wszystko i zamiast tego nauczyć się języka Swift. Twój wybór.
Mecki

25

Możesz z łatwością uczyć się C i Objective-C w tym samym czasie - z pewnością nie musisz uczyć się drobiazgów języka C (w tym arytmetyki wskaźnikowej itp.), Zanim zaczniesz od dodatków Objective-C do języka i jako początkujący programista szybkie rozpoczęcie pracy z Objective-C może pomóc w szybszym rozpoczęciu „myślenia w obiektach”.

Jeśli chodzi o dostępne zasoby, dokumentacja Apple zwykle zakłada znajomość języka C, więc rozpoczęcie od języka programowania Objective-C 2.0 nie przyniesie wiele korzyści. Zainwestowałbym w egzemplarz Programming in Objective-C autorstwa Stephena Kochana (w zależności od tego, jak szybko chcesz zacząć, możesz rozważyć poczekanie na drugą edycję):

Programowanie Objective-C Developers Library Programowanie Objective-C 2.0 Developers Library

Zakłada brak wcześniejszego doświadczenia i uczy Objective-C i tyle C, ile potrzebujesz.

Jeśli czujesz się trochę ambitny, możesz zacząć od samouczka „Learn C” Scotta Stevensona , ale ma on pewne wymagania wstępne („Powinieneś już znać przynajmniej jeden język skryptowy lub programowania, w tym funkcje, zmienne i pętle. Będę również musiał wpisywać polecenia w terminalu Mac OS X ”).

(Dla przypomnienia i dla kontekstu: nauczyłem się obu w tym samym czasie w 1991 roku - nie wydawało mi się to szkodzić. Miałem jednak doświadczenie w BASICu, Pascalu, Logo i LISP-ie. )


2
absolutnie nie powinieneś uważać za konieczne, aby najpierw nauczyć się C. Zwłaszcza jeśli znasz już język, taki jak C # w Javie. C # i Java wiele zawdzięczają obiektywnemu C. Chociaż C # wiele więcej zawdzięcza doświadczeniu Helsbergów i błędom w Delphi.
Daniel Honig

18

Dużo myślałem o tym problemie przed napisaniem mojej książki o Objective-C. Po pierwsze, naprawdę uważam, że nauka języka C przed nauką Objective-C to zła ścieżka. C ma charakter proceduralnyjęzyk zawierający wiele funkcji, które nie są niezbędne do programowania w Objective-C, zwłaszcza na poziomie początkującym. W rzeczywistości uciekanie się do niektórych z tych funkcji jest sprzeczne z przestrzeganiem dobrej metodologii programowania obiektowego. Nie jest też dobrym pomysłem nauczanie wszystkich szczegółów języka proceduralnego (i atakowanie rozwiązania problemu za pomocą funkcji i strukturalnych technik programowania) przed nauczeniem się języka zorientowanego obiektowo. Może to skierować programistę w złym kierunku, potencjalnie prowadząc do rozwinięcia złej orientacji i sposobu myślenia w celu wspierania dobrej dyscypliny programowania obiektowego. Tylko dlatego, że Objective-C jest rozszerzeniem języka C, nie oznacza, że ​​musisz najpierw nauczyć się C!

Uważam, że nauczanie Objective-C i podstawowego języka C jako jednego zintegrowanego języka jest właściwym podejściem. Nie ma powodu, aby uczyć się, że instrukcja „for” pochodzi z języka C, a nie z jego nadzbioru języka Objective-C. Ponadto, dlaczego dowiedzieć się szczegółowo o rzeczach takich jak macierze C i smyczki (i manipulowania nimi) przedna przykład poznawanie tablic (NSArray) i obiektów typu string (NSString)? Wiele tekstów w języku C poświęca dużo czasu strukturom i wskazuje na struktury oraz iteruje po tablicach za pomocą wskaźników. Ale możesz zacząć pisać programy Objective-C, nie wiedząc o żadnej z tych funkcji języka C. A dla początkującego programisty to wielka sprawa. To nie tylko skraca krzywą uczenia się, ale także zmniejsza ilość materiału, którego trzeba się nauczyć (a część z niego selektywnie odfiltrować) do pisania programów Objective-C.

Zgadzam się, że będziesz chciał nauczyć się większości, jeśli nie wszystkich, podstawowych funkcji języka C, ale wiele z nich można odłożyć do czasu solidnego zrozumienia definiowania klas i metod, pracy z obiektami i wyrażeniami wiadomości oraz zrozumienia koncepcji dziedziczenia i polimorfizm jest dobrze poznany.


To wszystko dla tych, którzy chcą się uczyć szybko, unikając zmagań i głębokiego zrozumienia. Uczę kompletnego programistycznego nooba (chociaż mam ponad 11 lat doświadczenia w programowaniu), aby programować i uczyć innych wcześniej (ale nie jestem nauczycielem, aby to wyjaśnić). I wiesz co? Wszystkie te koncepcje, do których wszyscy jesteśmy przyzwyczajeni, są tak skomplikowane i nieintuicyjne dla zupełnie początkujących! C to świetny sposób na zrozumienie rzeczy na wystarczająco niskim poziomie, aby w przyszłości nie było to dla nich magią. To powiedziawszy, dla lepszej krzywej uczenia się programisty lepiej jest na początku z C z jego barbarzyńskimi zasadami =)
MANIAK_dobrii

15

Zanurzyłbym się od razu w celu C - jeśli masz już za sobą kilka języków, to nie składnia jest krzywą uczenia się, to kakao.


1
Teraz, gdy to powiedziawszy, jest znacznie więcej materiałów do nauki C.Okazało się, że najtrudniejsza część dotycząca ObjC, brak materiału, który był dobrze zorganizowany, przejrzysty, miał wystarczająco dużo szczegółów, aby porównać go z materiałem w C lub C ++ i naprawdę pomóc ci zrozumieć, co było dzieje się w środku.
Spanky

10

Myślę, że w przeważającej części nauka C jest dobrym pomysłem bez względu na to, na jakiej arenie się wybierasz, przynajmniej po to, aby opanować wewnętrzne działanie tworzenia oprogramowania przed użyciem gotowych towarów, w ten sposób, jeśli coś pójdzie nie tak masz większą szansę na zrozumienie wewnętrznego działania. Jest wiele dyskusji na ten temat w SO i jest to raczej subiektywne pytanie, ale generalnie będziesz używać C w swoim kodzie Objective-C, więc myślę, że to naprawdę zależy od ciebie. Jestem człowiekiem z gruntu, ale czasami może to przeszkadzać i znam kilku mądrych ludzi, którzy pracowali z góry na dół. Myślę, że ważne jest, abyś zrozumiał wewnętrzne działanie tak, jak to będzie odróżnij swoje możliwości od tych, którzy tego nie robią, a także zwiększ swoje możliwości.


nauka języka C może również zniekształcić twój pogląd na programowanie obiektowe, jeśli nie jesteś w nim ugruntowany. Mieszanie kodowania strukturalnego i proceduralnego nie jest dobre. Ale także prawdą jest, że obiekt OO traci swoją wartość w wielu miejscach, w których C świeci, takich jak pisanie kodu niższego poziomu.
Daniel Honig

1
Mój powód, dla którego sugeruję każdemu programistowi naukę języka C w pewnym momencie, opiera się przynajmniej na pomyśle, że nawet języki OO kompilują się do tych samych dokładnych instrukcji, które ostatecznie robi C. Zmienne dla obiektów używają wskaźników, Garbage Collectors używają malloc i free, pliki są blokowane za pomocą uchwytów systemu operacyjnego; Gdy coś pójdzie nie tak w aplikacji Java lub C #, znajomość tych podstaw może znacznie poprawić zrozumienie tego, co poszło nie tak. Zrozumienie alokacji zasobów, które zostaną wykonane, prowadzi również do napisania bardziej świadomego kodu, który będzie działał bardziej optymalnie w określonym kontekście.
TheXenocide,

7

Dobrym pomysłem jest nauczenie się C przed nauką Objective-C, który jest ścisłym nadzbiorem C. Oznacza to, że Objective-C może obsługiwać cały normalny kod w C, więc kod wspólny dla programów C z pewnością pojawi się nawet w Objective- Kod C.

Oprócz spojrzenia na rzeczy z czysto językowego punktu widzenia, przekonasz się, że Mac OS X jest kompletnym systemem operacyjnym Unix. Wszystkie biblioteki na poziomie systemu są napisane w języku C.

Prawdopodobnie jest możliwe nauczenie się obu naraz, ale myślę, że docenisz i zrozumiesz Objective-C bardziej, jeśli najpierw będziesz miał solidną praktyczną wiedzę o C.


5

Nauczyłbym się Objective-C i nauczyłbym się tyle C, ile potrzebujesz, w miarę postępów.

Obszary C, na których nie będziesz polegać zbytnio:

  • Arytmetyka wskaźników i tablice. W ogóle nie używałem tablic C.
  • Ciągi C. Struny Objective-C wykonują zadanie ładniej i bezpieczniej.
  • Ręczne zarządzanie pamięcią, jeśli używasz GC w Obj-C 2.1. Bardzo polecam tę trasę ze względu na szybkość rozwoju i wydajność.

6
Jedno zastrzeżenie: zbieranie śmieci w Objective-C nie jest dostępne na wszystkich platformach (zwłaszcza na iPhonie), o czym należy pamiętać.
Mark Bessey

5

Kiedy uczysz się Objective-C i Cocoa, nie możesz uniknąć uczenia się bitów C. Na przykład prostokąty są często reprezentowane przez CGRect, strukturę C.

Jeśli masz czas, naucz się C. Jak powiedzieli inni, książka Kochana (drugie i pierwsze wydanie) jest doskonała jako książka do zanurzenia.


4

Jest wiele rzeczy, których nie możesz zrobić wyłącznie w Objective-C, więc opanowanie podstawowych umiejętności C będzie bardzo krytyczne. Będziesz musiał przynajmniej rozumieć deklaracje zmiennych i podstawowe funkcje biblioteki C, albo będziesz sfrustrowany.


3

Szczerze mówiąc, tak wiele języków jest opartych na składni C, że dobrze jest się z nimi zapoznać. Niezależnie od tego, zajęłoby mi tydzień lub dwa, żeby zapoznać się z C.

To powiedziawszy, po prostu nauczyłem się Celu C i muszę być szczery: moje doświadczenie z C nie było dla mnie tak przydatne, jak bym myślał. Cel C zdecydowanie otworzył mi oczy.


3

Możesz przejść bezpośrednio do celu C, co daje następujące korzyści:

  1. Przy okazji nauczysz się „trochę” C.
  2. Nauczysz się części C, które są dla Ciebie istotne.

Przynajmniej dla mnie jest łatwiej nauczyć się nowego języka, gdy interesuje mnie jakaś konkretna aplikacja lub próbka, a nie udaje mi się, gdy muszę nauczyć się czegoś, co nie jest dokładnie tym, co mnie interesuje.

Zawsze możesz udoskonalić swoją znajomość języka C później, jeśli zainteresuje Cię programowanie na niższym poziomie.


3

Lepiej, nie wiem, tym bardziej, że nie znam Objective-C.
Ale podstawy C nie są takie trudne do nauczenia, nie jest to bardzo skomplikowany język (pod względem składni, a nie pod względem masteringu!), Więc idź na to, nie będzie to stracony czas.
Osobiście uważam, że zawsze warto uczyć się C, ponieważ daje to dobry wgląd w działanie komputera. W końcu większość języków i systemów jest nadal napisana w C. W takim razie przejdź dalej! :-)

PS .: Mówiąc „dalej”, nie miałem na myśli „porzuć to”, tylko „ucz się więcej, ucz się inaczej”. Kiedy już znasz C, możesz go nigdy nie upuścić: Java używa JNI do wywoływania procedur C dla rzeczy niskiego poziomu, Python, Lua itp. Są często rozszerzone o kod C (odniesienia Lua zakładają nawet pewną wiedzę o C dla niektórych funkcji, cienkie opakowanie do funkcji C z tyłu) i tak dalej.



2

Według Wikipedii Objective-C to ścisły super zbiór C. W takim przypadku sugerowałbym najpierw nauczyć się C. Wtedy, kiedy nauczysz się Objective-C, będzie jasne, które części zostaną dodane jako część Objective-C.


2

C daje bardzo mało abstrakcji w asemblerze. Niektóre kompilatory języka C pozwalają nawet na asemblację inline. Może to być bardzo przydatne do zastanowienia się, jak działa komputer, co jest ważne, aby wiedzieć.

Biorąc to pod uwagę, jeśli naprawdę interesujesz się Object-C, nie pozwól sobie na utknięcie w pisaniu czegoś w C tylko dlatego, że jest to „dobre dla Ciebie”. Nie musisz się frustrować, próbując nauczyć się nowego zestawu umiejętności. Ważne jest, abyś dobrze się bawił z tym, co robisz.



2

Cel C na tyle różni się od C, że nie zasługuje na nauczenie się C.

Z perspektywy składni / rodziny językowej prawie lepiej jest studiować SmallTalk (na którym opiera się cel C)

Z praktycznego punktu widzenia skup się na nauce jednego języka na raz.

Później, jeśli chcesz nauczyć się innego języka, C ++, Java i Python są 1) łatwe do nauczenia jako kilka 2) popularne, a zatem dostępne na rynku 3) potężne.


1
Nie, Objective-C to bardzo mała nadzbiór C. Bez C nie możesz nic zrobić w Objective-C. Jasne, model obiektowy pochodzi z smalltalk, ale składnia w większości części nie jest nawet bliska.
Sven

2

Powinieneś mieć podstawową wiedzę na temat C przed rozpoczęciem Objective_C, ale nie ma potrzeby opanowania każdego szczegółu C.

Opublikowałem swoje notatki po przeczytaniu "Programowanie w Objective-C" na wypadek, gdyby pomogło to komuś innemu.

nauczyć się celu c z programowaniem


1

W zależności od wielu języków, które już znasz, lepszym pomysłem może być po prostu rozpoczęcie nauki Objective-C. Podstawy w większości języków są zasadniczo takie same, to inna składnia. Nauka C jako pierwsza nie będzie miała większego znaczenia, jeśli chodzi o naukę Objective-C.


Ale tylko wtedy, gdy zna się przynajmniej jeden inny język programowania.
Sven

Oprócz komentarza @ Svena: „... który ma pewną koncepcję wskaźników”
MANIAK_dobrii,

1

Od razu nauczyłem się Objective-C i działało dobrze przez około rok, po prostu miałem trudności z czytaniem kodu C, kiedy pobierałem projekt, aby zobaczyć, jak działają, ale teraz naprawdę czuję potrzebę nauczenia się C. Możesz spróbować się nauczyć ObjC bez C, ale wcześniej czy później będziesz potrzebować C.


1

IMHO należy najpierw nauczyć się przynajmniej części C, a zwłaszcza wskazówek. Jest to jeszcze ważniejsze, jeśli ktoś pochodzi z języka, który nie ma wskaźników. Wiele osób pyta o kod, taki jak

NSString *string = [[NSString alloc] init];
string = @"something";

ponieważ nie wiedzą o różnicy między wskaźnikiem a obiektem, na który wskazuje.

Oczywiście nie trzeba uczyć się całego C, zanim zacznie się Objective-C, ale pewne podstawowe rzeczy są absolutnie konieczne.


Chciałbym móc głosować +10. Pewnego razu w wywiadzie dla deweloperów obj-c zapytano mnie, czy można stworzyć wskaźnik do NSInteger ... Byłem zszokowany, ponieważ było to dla mnie tak istotne, ale wydaje się nie dla wszystkich. Jest to więc ważne i łatwo zapomnieć, że również to należy zrozumieć.
MANIAK_dobrii,

0

Heck nie, idź prosto do celu C!

Przeszedłem z ActionScript 3 do Objective C i mam już stażystę w firmie!

Rób co chcesz.


Dlaczego miałbyś całkowicie pominąć stan umysłu zorientowanego obiektowo i zacząć uczyć się najpierw języka C? To jak nauka pływania na latawcu i nadzieja na pilotowanie. Od samego początku musisz zintegrować OOP.
SwiftArchitect

0

Jeśli wcześniej nauczyłeś się innego języka, zawsze będziesz mieć zamieszanie w pisaniu prawidłowej składni. Nie znam celu, ale Object C używa dziwnej (nie powszechnej) składni do wywoływania metod obiektowych. Nazywa to wysyłaniem wiadomości, tak, to prawda, zgodnie z czystą koncepcją zorientowaną obiektowo, jednak większość języków zorientowanych obiektowo nazywa to metodą wywoływania i używa bardziej tradycyjnej składni metod wywoływania. Zbieranie śmieci jest również czymś bardzo dziwnym, obiekt C jest oparty na starej szkole zliczania odwołań. Więc będziesz miał trudności z zaakceptowaniem tego, jeśli zmienisz inny język. Piszę książkę Przewodnik po szybkiej migracji obiektu C dla programistów C / C ++, którzy chcą pomóc ludziom w szybszym wychwyceniu wszystkich różnic.


Ponieważ w Objective-C "wysłanie wiadomości" nie jest "wywołaniem metody", ale jednocześnie wysłanie wiadomości powoduje wywołanie metody (funkcji) =) Kiedy wysyłasz wiadomość do obiektu, przechodzi ona przez wysyłkę wiadomości mechanizm (można o tym przeczytać tutaj: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/... lub tutaj: stackoverflow.com/questions/982116/... )
MANIAK_dobrii
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.