Yanıtlar:
Önce C'yi öğrenirdim. Obj-C'ye geçmeden önce C'yi öğrendim (ve C'de çok şey yaptım). Asla gerçek C programcısı olmayan birçok meslektaşım var, bunlar Obj-C ile başladılar ve sadece gerektiği kadar C öğrendiler.
Arada sırada bir problemi nasıl tamamen Obj-C'de çözdüklerini, bazen çok beceriksiz çözümlerle sonuçlandıklarını görüyorum. Genellikle daha sonra bazı Obj-C kodunu saf C koduyla değiştiririm (sonuçta bunları istediğiniz kadar karıştırabilirsiniz, bir Obj-C yönteminin içeriği tamamen saf C kodu olabilir). Herhangi bir Obj-C programcısına hakaret etme niyeti olmadan, Obj-C'de çok zarif çözümler var, bunlar nesneler sayesinde çok daha iyi çalışan (ve görünen) çözümlerdir.(OOP programlama, karmaşık programları işlevsel programlamadan çok daha güzel hale getirebilir; örneğin polimorfizm mükemmel bir özelliktir) ... ve Obj-C'yi gerçekten seviyorum (C ++ 'dan çok daha fazla! C ++ sözdiziminden nefret ediyorum ve bazı dil özellikleri aşırılık. ve kötü gelişme modellerine yol açar (IMHO); ancak, bazen meslektaşlarımın Obj-C kodunu yeniden yazdığımda (ve gerçekten sadece bunu yapıyorum, bunun kesinlikle gerekli olduğunu düşünürsem), ortaya çıkan kod genellikle% 50 daha küçüktür ve kullandığı belleğin yalnızca% 25'ine ihtiyaç duyar daha önce ve çalışma zamanında yaklaşık% 400 daha hızlı.
Burada söylemeye çalıştığım şey: Her dilin artıları ve eksileri vardır. C'nin artıları ve eksileri var, Obj-C de öyle. Bununla birlikte, Obj-C'nin gerçekten harika özelliği (bu yüzden onu Java'dan daha çok seviyorum), istediğiniz zaman düz C'ye geçip tekrar geri dönebilmenizdir. Bu neden bu kadar harika bir özellik? Tıpkı Obj-C'nin saf C'nin birçok dezavantajını düzelttiği gibi, saf C de Obj-C'nin bazı dezavantajlarını düzeltebilir. Onları bir araya getirirseniz çok güçlü bir takım elde edersiniz.
Yalnızca Obj-C'yi öğrenirseniz ve C hakkında hiçbir fikriniz yoksa veya yalnızca temellerini biliyorsanız ve bazı genel sorunları ne kadar zarif bir şekilde çözebileceğini hiç denemediyseniz, aslında Obj-C'nin yalnızca yarısını öğrendiniz. C, Obj-C'nin temel bir parçasıdır. C'yi her zaman ve her yerde kullanma yeteneği onun temel bir özelliğidir.
Tipik bir örnek, verileri base64'te kodlamak zorunda olduğumuz bazı kodlardı, ancak bunun için harici bir kitaplık kullanamadık (OpenSSL kitaplığı yok). Tamamen Cocoa sınıfları kullanılarak yazılmış bir base64 kodlayıcı kullandık. İyi çalışıyordu, ancak 200 MB ikili veriyi kodladığımızda, sonsuza kadar sürdü ve bellek yükü kabul edilemezdi. Tamamen tek bir C işlevi olarak yazılmış küçük, ultra kompakt bir base64 kodlayıcıyla değiştirdim (işlev gövdesini yöntem gövdesine kopyaladım, yöntem NSData'yı girdi olarak aldı ve çıktı olarak NSString'i döndürdü, ancak işlevin içinde her şey C idi). C kodlayıcı çok daha kompakttı, saf Cocoa kodlayıcısını hız olarak 8 faktör ile geçti ve bellek ek yükü de çok daha azdı. Verileri kodlama / kod çözme, bitlerle oynama ve benzer düşük seviyeli görevler C'nin güçlü noktalarıdır.
Başka bir örnek, çok sayıda grafik çeken bazı UI koduydu. Grafikleri boyamak için gerekli verileri depolamak için NSArray'leri kullandık. Aslında NSMutableArray, grafik canlandırıldığından beri. Sonuç: Çok yavaş grafik animasyonu. Tüm NSArray'leri normal C dizileriyle, yapıları olan nesneleri (tüm grafik koordinat bilgileri nesnelerde olması gereken hiçbir şey olmadığından sonra), numaralandırıcı erişimini basit for döngüleri ile değiştirdik ve verileri bir diziden diğerine almak yerine memcopy ile diziler arasında taşımaya başladık. diğeri, indeks için indeks. Sonuç: 4 faktör oranında hızlanma. Grafik, eski PPC sistemlerinde bile sorunsuz bir şekilde canlandırıldı.
C'nin zayıflığı, her karmaşık programın uzun vadede çirkinleşmesidir. C uygulamalarını okunabilir, genişletilebilir ve yönetilebilir tutmak, bir programcının çok disiplinli olmasını gerektirir. Bu disiplin eksik olduğu için birçok proje başarısız oluyor. Obj-C, uygulamanızı sınıflar, kalıtım, protokoller vb. Kullanarak yapılandırmanızı kolaylaştırır. Bununla birlikte, gerekli olmadıkça bir yöntemin sınırları boyunca saf C işlevselliğini kullanmam. Tüm kodu bir nesnenin yöntemi dahilinde bir Objective-C uygulamasında tutmayı tercih ediyorum; diğer her şey bir OO uygulamasının amacını bozar. Bununla birlikte, yöntem içinde bazen yalnızca saf C kullanıyorum.
C ve Objective-C'yi aynı anda kolayca öğrenebilirsiniz - Objective-C'nin dile eklemelerine başlamadan önce ve acemi bir programcı olarak C'nin en küçük ayrıntılarını (işaretçi aritmetiği vb. Dahil) öğrenmeye kesinlikle gerek yoktur. Objective-C ile hızlı bir şekilde çalışmaya başlamak "nesnelerde düşünmeye" daha hızlı başlamanıza yardımcı olabilir.
Mevcut kaynaklar açısından, Apple'ın belgeleri tipik olarak C'ye aşina olduğunu varsayar, bu nedenle The Objective-C 2.0 Programlama Dili ile başlamak sizin için pek bir fayda sağlamayacaktır. Stephen Kochan tarafından hazırlanan Programming in Objective-C'nin bir kopyasına yatırım yapacağım (ne kadar çabuk başlamak istediğinize bağlı olarak, ikinci baskıyı beklemeyi düşünebilirsiniz):
Programlama Amaç-C Geliştirici Kitaplığı Programlama Hedef-C 2.0 Geliştirici Kitaplığı
Önceden deneyime sahip olmadığını varsayar ve size Objective-C ve ihtiyacınız olduğu kadar C öğretir.
Biraz hırslı hissediyorsanız, Scott Stevenson'un "Learn C" Öğreticisi ile başlayabilirsiniz , ancak bunun bazı ön koşulları vardır ("İşlevler, değişkenler ve döngüler dahil en az bir komut dosyası veya programlama dili bilmelisiniz. Sen" Ayrıca Mac OS X Terminaline komut yazmanız gerekecek. ").
(Sadece kayıt ve bağlam için: Her ikisini de 1991'de aynı zamanda öğrendim - bana herhangi bir zarar vermedi. Yine de BASIC, Pascal, Logo ve LISP'de bir geçmişim var . )
Kitabımı Objective-C üzerine yazmadan önce bu konu hakkında çok düşündüm. Öncelikle, Objective-C'yi öğrenmeden önce C dilini öğrenmenin yanlış yol olduğuna gerçekten inanıyorum. C bir prosedüreldirÖzellikle acemi düzeyinde, Objective-C'de programlama için gerekli olmayan birçok özelliği içeren dil. Aslında, bu özelliklerden bazılarına başvurmak, iyi bir nesne yönelimli programlama metodolojisine bağlı kalmanın tam tersidir. Nesne yönelimli bir dil öğrenmeden önce prosedürel bir dilin tüm ayrıntılarını öğretmek (ve bir problemin çözümüne işlevler ve yapılandırılmış programlama teknikleriyle saldırmak) iyi bir fikir değildir. Bu, programcıyı yanlış yönde başlatabilir ve potansiyel olarak iyi bir nesne yönelimli programlama disiplini geliştirmek için yanlış yönelim ve zihniyet geliştirmesine yol açabilir. Objective-C'nin C dilinin bir uzantısı olması, önce C'yi öğrenmeniz gerektiği anlamına gelmez!
Objective-C'yi ve altında yatan C dilini tek bir entegre dil olarak öğretmenin doğru yaklaşım olduğunu düşünüyorum. Bir "for" ifadesinin, üst set Objective-C dilinden değil, C dilinden olduğunu öğrenmek için hiçbir neden yoktur. Dahası, neden C dizileri ve dizeleri gibi şeyler hakkında ayrıntılı bilgi edinin (ve bunları işleyin) önceörneğin dizi (NSArray) ve dizi nesneleri (NSString) hakkında bilgi edinmek? Birçok C metni, yapılara ve yapılara işaretçilerle ve işaretçilerle diziler arasında yinelemeye çok zaman ayırır. Ancak bu C dili özelliklerinden hiçbirini bilmeden Objective-C programları yazmaya başlayabilirsiniz. Acemi bir programcı için bu çok önemli. Bu sadece öğrenme eğrisini kısaltmakla kalmaz, aynı zamanda Objective-C programları yazmak için öğrenilmesi gereken (ve bazıları seçici olarak filtrelenen) materyal miktarını da azaltır.
Altta yatan C özelliklerinin hepsini değilse de çoğunu öğrenmek isteyeceğinize katılıyorum, ancak birçoğu sınıfları ve yöntemleri tanımlamanın, nesneler ve mesaj ifadeleriyle çalışmanın ve kalıtım ve polimorfizm iyi anlaşılmıştır.
Doğrudan Objective C'ye dalardım - eğer halihazırda birkaç diliniz varsa, öğrenme eğrisi olan sözdizimi değil, Cocoa'dır.
Çoğunlukla, C öğrenmenin, hangi arenaya giderseniz gidin, en azından önceden paketlenmiş ürünleri kullanmadan önce yazılım geliştirmenin iç işleyişini anlamak için iyi bir fikir olduğunu düşünüyorum, bu şekilde bir şeyler ters giderse İç işleyişi anlama şansınız daha yüksektir. SO'da bununla ilgili pek çok tartışma var ve bu oldukça öznel bir soru, ancak genel olarak Objective-C kodunuzda doğal olarak C kullanacaksınız, bu yüzden sanırım bu gerçekten size kalmış. Ben temelden yukarı bir insanım, ama bazen bu işe yarayabilir ve tepeden tırnağa kendi yolunda çalışan birkaç zeki insan tanıyorum, bence önemli olan, iç işleyişi gerektiği gibi anlamanızdır. Yeteneklerinizi, yeteneklerinizi artırmanın yanı sıra yapmayanlardan ayırın.
C'nin katı bir üst kümesi olan Objective-C'yi öğrenmeden önce C'yi öğrenmek iyi bir fikirdir. Bu, Objective-C'nin tüm normal C kodunu destekleyebileceği anlamına gelir, bu nedenle C programlarında ortak olan kod, Objective- C kodu.
Her şeye yalnızca dil açısından bakmanın yanı sıra, Mac OS X'in eksiksiz bir Unix işletim sistemi olduğunu göreceksiniz. Tüm sistem seviyesi kitaplıkları C'de yazılmıştır.
Muhtemelen her ikisini de aynı anda öğrenmek mümkündür, ancak önce sağlam bir çalışma bilgisine sahipseniz, Objective-C'yi daha çok takdir edeceğinizi ve anlayacağınızı düşünüyorum.
Objective-C'yi ve ilerledikçe ihtiyaç duyduğunuz kadar C'yi öğrenirdim.
C'nin çok fazla bağımlı olmayacağınız alanları:
Objective-C ve Cocoa'yı öğrenirken, C'nin bitlerini öğrenmekten kaçınamazsınız. Örneğin, dikdörtgenler genel olarak bir C yapısı olan CGRect ile temsil edilir.
Vaktiniz varsa, kesinlikle C'yi öğrenin. Diğerlerinin burada söylediği gibi, Kochan'ın kitabı (ikinci ve ilk baskılar) dalmak için mükemmel bir kitaptır.
Yalnızca Objective-C'de yapamayacağınız pek çok şey vardır, bu nedenle bazı temel C becerilerini öğrenmek oldukça kritik olacaktır. En azından değişken bildirimlerini ve temel C kütüphanesi işlevlerini anlamanız gerekecek, yoksa hayal kırıklığına uğrayacaksınız.
Dürüst olmak gerekirse, o kadar çok dil C sözdizimine dayanır ki, aşina olmak iyi bir şeydir. Ne olursa olsun kendinizi C'ye alıştırmak bir veya iki hafta sürer.
Bununla birlikte, sadece kendime Hedef C'yi öğrettim ve dürüst olmam gerekiyor: C deneyimimi düşündüğüm kadar faydalı bulmadım. Objective C kesinlikle benim için göz açıcıydı.
Aşağıdaki avantajlarla birlikte doğrudan Objective-C'ye geçebilirsiniz:
En azından belirli bir uygulama veya örnekle ilgilendiğimde yeni bir dil öğrenmek benim için daha kolay ve tam olarak ilgilendiğim şey olmayan başka bir şey öğrenmem gerektiğinde başarısız oluyorum.
Daha düşük seviyeli programlamayla ilgilenirseniz daha sonra C bilginizi her zaman iyileştirebilirsiniz.
Daha iyisi, Objective-C'ye aşina olmadığımdan daha azını bilmiyorum.
Ancak C'nin temellerini öğrenmek o kadar zor değil, çok karmaşık bir dil değil (sözdizimi açısından, ustalaşma açısından değil!), Öyleyse devam edin, zaman israfı olmayacak.
Kişisel olarak, C'yi öğrenmenin her zaman iyi bir fikir olduğunu düşünüyorum, bilgisayarın nasıl çalıştığına dair iyi bir fikir veriyor. Sonuçta, çoğu dil ve sistem hala C'de yazılıyor. Sonra devam edin! :-)
Not: "Devam et" derken "bırak" demek istemedim, sadece "daha fazla öğren, farklı öğren". C'yi öğrendikten sonra, onu asla bırakmayabilirsiniz: Java, düşük seviyeli şeyler için C yordamlarını çağırmak için JNI kullanır; Python, Lua, vb. Genellikle C koduyla genişletilir (Lua referansı, yalnızca bazı işlevler için bazı C bilgilerini varsayar. C işlevi için ince bir sarıcı) vb.
Evet, C dilini diğer gelişmiş dillerden önce öğrenmek, diğer dilleri hızlı bir şekilde öğrenmenize yardımcı olacaktır.
Wikipedia'ya göre , Objective-C, C'nin katı bir süper kümesidir. Bu durumda, önce C'yi öğrenmenizi öneririm. Daha sonra Objective-C'yi öğrendiğinizde, Objective-C'nin bir parçası olarak hangi parçaların eklendiği açık olacaktır.
C size montajdan çok az soyutlama verir. Hatta bazı C Derleyicileri satır içi montaj yapmanıza izin verir. Bu, bilgisayarın nasıl çalıştığını düşünmek için çok yararlı olabilir, bu da bilmek önemlidir.
Bununla birlikte, eğer Object-C ile gerçekten ilgileniyorsanız, sadece "sizin için iyi" olduğu için C ile bir şeyler yazarken takılıp kalmanıza izin vermeyin. Yeni bir beceri seti öğrenmeye çalışırken kendinizi hayal kırıklığına uğratmanıza gerek yok. Yaptıklarınla eğlenmen çok önemli.
Sert çekirdekli bir geliştirici olmak istiyor musunuz? O zaman önce c'yi öğrenin.
Tamamen ustalaşmanız gereken kitaplar, teknolojideki en iyi yazılardan bazılarıdır. İşte ihtiyacınız olan şey:
Hedef C, önce C'yi öğrenmeyi hak etmemek için C'den yeterince farklıdır.
Sözdizimi / dil ailesi perspektifinden, SmallTalk (C hedefinin dayandığı) çalışmaktan neredeyse daha iyidir
Pratik bir bakış açısıyla, çabalarınızı her seferinde bir dil öğrenmeye odaklayın.
Daha sonra, başka bir dil öğrenmek isterseniz, C ++, Java ve Python 1) bir grup olarak öğrenmesi kolaydır 2) popüler ve dolayısıyla pazarlanabilir 3) güçlüdür.
Objective_C'ye başlamadan önce temel bir C bilgisine sahip olmalısınız, ancak C'nin her ayrıntısına hakim olmanız gerekmez.
Başkasına yardımcı olma ihtimaline karşı, "Objective-C'de Programlama" yı okuduktan sonra notlarımı yayınladım.
Zaten bildiğiniz birçok dile bağlı olarak, Objective-C'yi öğrenmeye başlamak daha iyi bir fikir olabilir. Çoğu dilde temel temelde aynıdır, farklı olan sözdizimidir. Konu Objective-C olduğunda önce C'yi öğrenmek gerçekten bir fark yaratmayacaktır.
Hemen Objective-C'yi öğrendim ve yaklaşık bir yıldır gayet iyi çalıştı, nasıl çalıştıklarını görmek için projeyi indirdiğimde C kodunu okumakta biraz güçlük çektim, ama şimdi gerçekten C'yi öğrenme ihtiyacını hissediyorum. Öğrenmeyi deneyebilirsin C'siz ObjC, ancak er ya da geç C'ye ihtiyacınız olacak.
IMHO kişi önce en azından biraz C ve özellikle işaretçiler hakkında bilgi edinmelidir. İşaretçi olmayan bir dilden geliyorsa bu daha da önemlidir. Pek çok insan şu şekilde kod soruyor:
NSString *string = [[NSString alloc] init];
string = @"something";
çünkü işaretçi ile işaret ettiği nesne arasındaki farkı bilmiyorlar.
Elbette , Objective-C ile başlamadan önce C'nin tamamını öğrenmek zorunda değilsiniz , ancak bazı temel şeyler kesinlikle gereklidir.
Heck hayır, doğrudan C hedefine gidin!
ActionScript 3'ten Objective C'ye geçtim ve zaten bir şirkette stajyerim var!
Ne istiyorsan onu yap.
Önceden başka bir dil öğrenirseniz, doğru sözdizimi yazarken her zaman kafa karışıklığı yaşarsınız. Amacı bilmiyorum, ancak Object C, nesne yöntemlerini çağırmak için garip (yaygın olmayan) sözdizimi kullanıyor. Bunu mesaj gönderme olarak adlandırır, evet, buna göre saf Nesne Yönelimli kavramdır, ancak çoğu Nesne yönelimli dil bunu arama yöntemi olarak adlandırır ve arama yöntemlerinin daha geleneksel sözdizimini kullanır. Çöp toplama da çok garip bir şey, Nesne C eski okul referans sayısına dayanıyor. Yani başka bir dilden geçiş yaparsanız kabul etmekte zorlanacaksınız. İnsanların tüm farklılıkları daha hızlı algılamalarına yardımcı olmayı umarak C / C ++ programcıları için bir Object C hızlı geçiş kılavuzu yazıyorum.