回答:
最初にCを学びます。Obj-Cに移行する前に、Cを学びました(Cで多くのことを行いました)。私は本物のCプログラマーではなかった多くの同僚がいます。彼らはObj-Cから始めて、必要なだけCを学びました。
彼らがObj-Cで問題を完全に解決する方法を時々見ています。通常、私はいくつかのObj-Cコードを純粋なCコードに置き換えます(すべてを好きなだけ組み合わせることができるので、Obj-Cメソッドのコンテンツは完全に純粋なCコードにすることができます)。Obj-Cプログラマーを侮辱する意図はありませんが、Obj-Cには非常に洗練されたソリューションがあり、これらはオブジェクトのおかげで機能(および外観)が向上するソリューションです(OOPプログラミングは、複雑なプログラムを関数型プログラミングよりもはるかに魅力的にすることができます。たとえば、ポリモーフィズムは素晴らしい機能です)...そして、私は本当にObj-Cが好きです(C ++よりもはるかに好きです!C ++構文が嫌いで、一部の言語機能は明白です)悪い開発パターンにつながる私見); ただし、同僚のObj-Cコードをときどき書き換えるとき(そして、これが絶対に必要だと思う場合は、実際にそうするだけです)、結果のコードは通常50%小さく、必要なメモリの25%しか必要ありません以前は、実行時に約400%高速です。
ここで私が言おうとしていること:すべての言語には長所と短所があります。Cには長所と短所があり、Obj-Cにもあります。ただし、Obj-Cの本当に優れた機能(それが、私がJavaよりも気に入っている理由です)は、プレーンCに自由にジャンプして、また元に戻すことができることです。なぜこれがこんなに優れた機能なのですか?Obj-Cが純粋なCの多くの短所を修正するように、純粋なCはObj-Cのいくつかの短所を修正できます。それらを混ぜ合わせると、非常に強力なチームを獲得できます。
Obj-Cのみを学習し、Cの知識がない、またはCの基本のみを理解していて、いくつかの一般的な問題を解決できるエレガントさを試したことがない場合、実際にObj-Cの半分しか学習していません。CはObj-Cの基本的な部分です。いつでもどこでもCを使用できることは、Cの基本的な機能です。
典型的な例としては、base64でデータをエンコードする必要があるコードを使用しましたが、そのための外部ライブラリを使用できませんでした(OpenSSL libなし)。完全にCocoaクラスを使用して記述されたbase64エンコーダーを使用しました。正常に機能していましたが、200 MBのバイナリデータをエンコードするように設定すると、永遠にかかり、メモリオーバーヘッドが許容できなくなりました。完全に1つのC関数として記述された非常にコンパクトなbase64エンコーダーに置き換えました(関数の本体をメソッドの本体にコピーし、メソッドはNSDataを入力として受け取り、NSStringを出力として返しましたが、関数内はすべてCでした)。Cエンコーダーははるかにコンパクトであり、純粋なCocoaエンコーダーよりも速度が8倍優れており、メモリのオーバーヘッドもはるかに少なかった。データのエンコード/デコード、ビットの操作などの低レベルのタスクは、Cの強みにすぎません。
もう1つの例は、多くのグラフを描画するUIコードです。グラフの描画に必要なデータを格納するために、NSArrayを使用しました。グラフがアニメーション化されたため、実際にはNSMutableArrayです。結果:非常に遅いグラフアニメーション。すべてのNSArrayを通常のC配列に置き換え、オブジェクトを構造体に置き換え(すべてのグラフ座標情報がオブジェクトに必要なものではなくなった後)、単純なforループで列挙子にアクセスし、1つの配列からもう1つはインデックスのインデックスです。結果:4倍のスピードアップ。古いPPCシステムでも、グラフはスムーズにアニメーション化されました。
Cの弱点は、より複雑なプログラムが長期的に見れば醜くなることです。Cアプリケーションの可読性、拡張性、管理性を維持するには、プログラマーに多くの規律が要求されます。この規律が欠落しているため、多くのプロジェクトが失敗します。Obj-Cを使用すると、クラス、継承、プロトコルなどを使用してアプリケーションを簡単に構成できます。そうは言っても、必要がない限り、メソッドの境界を越えて純粋なC機能を使用することはしません。私はObjective-Cアプリのすべてのコードをオブジェクトのメソッド内に保持することを好みます。それ以外のものはすべて、OOアプリケーションの目的を無効にします。ただし、メソッド内では、純粋なCのみを使用する場合があります。
CとObjective-Cを同時に十分に学ぶことができます-Objective-Cの言語への追加を始める前、および初心者プログラマーとして、Cの特徴点(ポインター演算などを含む)を学ぶ必要はありません。 Objective-Cをすぐに使い始めると、「オブジェクトの思考」をより早く始めるのに役立つ場合があります。
利用可能なリソースに関して、Appleのドキュメントは通常Cに精通していることを前提としているため、 Objective-C 2.0プログラミング言語ことはあまりメリットがありません。私はStephen KochanによるObjective-Cのプログラミングのコピーに投資します(どれだけ早く始めたいかによっては、第2版を待つことを検討してください)。
Objective-C開発者ライブラリのプログラミング プログラミングObjective-C 2.0開発者ライブラリ
事前の経験はなく、Objective-Cと必要なだけのCを学習できます。
少し野心的な気分なら、スコットスティーブンソンの「Learn C」チュートリアルから始めることができます。から、いくつかの前提条件があります(「関数、変数、ループなど、少なくとも1つのスクリプト言語またはプログラミング言語をすでに知っている必要があります。また、Mac OS Xターミナルにコマンドを入力する必要があります。」)。
(ちょうど記録とコンテキストのために:私は1991年に両方を同時に学びました-それは私に何の害もないように思われました。しかし、私はBASIC、Pascal、ロゴ、およびLISPの経歴を持っていました。 )
Objective-Cに関する本を書く前に、この問題についてよく考えました。まず、Objective-Cを学ぶ前にC言語を学ぶことは間違った道だと私は本当に信じています。Cは手続き型特に初心者レベルでは、Objective-Cでのプログラミングに不要な多くの機能を含む言語。実際、これらの機能のいくつかを使用することは、優れたオブジェクト指向プログラミング手法を厳守することに反します。オブジェクト指向のものを学ぶ前に、手続き型言語の詳細をすべて教える(そして関数や構造化プログラミング手法で問題の解決策を攻撃する)こともお勧めしません。これは、プログラマーを誤った方向から開始する可能性があり、潜在的に、適切なオブジェクト指向プログラミングの規律を育成するための誤った方向性と考え方を発達させることになります。Objective-CがC言語の拡張であるからといって、最初にCを学ぶ必要があるわけではありません。
Objective-Cと基礎となるC言語を単一の統合言語として教えることが正しいアプローチだと思います。「for」ステートメントがC言語からのものであり、そのスーパーセットのObjective-C言語からのものではないことを学ぶ理由はありません。さらに、なぜCの配列や文字列のようなものについて(そしてそれらを操作するために)詳細を学ぶのか前にたとえば、配列(NSArray)と文字列オブジェクト(NSString)について学習していますか?多くのCテキストは、構造体と構造体へのポインタに多くの時間を費やし、ポインタを使用して配列を反復します。しかし、これらのC言語機能について知らなくても、Objective-Cプログラムの作成を開始できます。そして、初心者プログラマにとって、それは大したことです。これにより、学習曲線が短縮されるだけでなく、Objective-Cプログラムを作成するために学習する必要のある資料(およびその一部を選択的に除外)の量も削減されます。
基礎となるCの機能のすべてではなくてもほとんどを学びたいと思うことに同意しますが、クラスとメソッドの定義、オブジェクトとメッセージ式の操作、および継承とポリモーフィズムはよく理解されています。
ほとんどの場合、Cを学ぶことは、どのような分野に行っても、少なくともパッケージ化された商品を使用する前にソフトウェア開発の内部の仕組みを理解し、何か問題が発生した場合に備えておくとよいでしょう。あなたは内部の仕組みを理解するより良いチャンスがあります。SOについてはこれについて多くの議論があり、それはかなり主観的な質問ですが、一般的にはObjective-Cコード内で本質的にCを使用することになるので、それは本当にあなた次第だと思います。私は根っからの人ですが、時には邪魔になることもあり、上から下に向かって働いた賢い人が何人か知っています。重要な部分は、内部の仕組みを理解することです。自分の能力を、そうでない者とは別に設定し、能力を向上させます。
私はObjective-Cを学び、必要に応じて必要なだけCを学びます。
あまり依存しないCの領域:
Objective-CとCocoaを学習するとき、Cのビットの学習を避けることはできません。たとえば、長方形は一般的にC構造体であるCGRectで表されます。
時間があれば、ぜひCを学んでください。ここで他の人が言ったように、Kochanの本(第2版と第1版)は、読むのに最適な本です。
Objective-Cに慣れていないので、よくわかりません。
しかし、Cのベースは習得が難しくなく、非常に複雑な言語ではありません(マスタリングの観点からではなく、構文の観点から!)。そのため、それを試してみれば、時間の無駄になりません。
個人的には、Cを学ぶことは常に良い考えだと思います、それはコンピュータがどのように機能するかについての良い洞察を与えます。結局のところ、ほとんどの言語とシステムはまだCで書かれています。次に進んでください!:-)
PS .:「先に進む」とは、「落とす」という意味ではなく、単に「もっと学び、違うことを学ぶ」という意味です。Cを知ったら決して落とさないかもしれません。JavaはJNIを使用して低レベルのもののCルーチンを呼び出し、Python、LuaなどはCコードで拡張されることがよくあります(Lua参照は、背後にあるC関数への薄いラッパーなど)。
あなたはハードコア開発者になりたいですか?次に、最初にcを学習します。
cを完全に習得するために必要な本は、テクノロジーの優れた著作の一部です。必要なものは次のとおりです。
目的Cは、Cを最初に学習する価値がないほどCとは十分に異なります。
シンタックス/言語ファミリの観点から見ると、SmallTalk(目的Cが基づいている)を勉強する方がほとんど得策です。
実践的な観点からは、一度に1つの言語を学ぶことに集中してください。
その後、別の言語を学びたい場合、C ++、Java、Pythonは1)束として簡単に習得できます2)人気があり、市場性がある3)強力です。
Objective_Cを開始する前にCの基本的な知識が必要ですが、Cのすべての詳細をマスターする必要はありません。
「Objective-Cでのプログラミング」を読んだ後、他の人を助けるためにノートを公開しました。
私はObjective-Cをすぐに習得し、約1年間問題なく動作しました。プロジェクトをダウンロードして動作を確認するときにCコードを読むのに苦労しましたが、今はCを学ぶ必要性を本当に感じています。 CなしのObjCですが、遅かれ早かれ、Cが必要になります。
私見1つはまず、少なくともいくつかのCについて、特にポインターについて学ぶべきです。ポインタを持たない言語からのものである場合、それはさらに重要です。多くの人が次のようなコードについて尋ねます
NSString *string = [[NSString alloc] init];
string = @"something";
彼らはポインタとそれが指すオブジェクトの違いを知らないからです。
もちろん、Objective-Cを始める前にCのすべてを学ぶ必要はありませんが、いくつかの基本的なことが絶対に必要です。
いやいや、目的Cに直行!
私はActionScript 3からObjective Cに移行しましたが、会社にすでにインターンがいます!
やりたいことをしてください。
以前に他の言語を学習している場合、正しい構文を書くことは常に混乱します。目的はわかりませんが、オブジェクトCは奇妙な(一般的ではない)構文を使用してオブジェクトメソッドを呼び出します。それはそれをメッセージの送信と名付けています、そうです、それに応じて純粋なオブジェクト指向の概念は真実ですが、ほとんどのオブジェクト指向言語はそれを呼び出しメソッドと呼び、より伝統的な呼び出しメソッドの構文を使用します。ガベージコレクションも非常に奇妙です。オブジェクトCは古い学校の参照カウントに基づいています。したがって、他の言語から切り替えると、それを受け入れるのが困難になります。私は、C / C ++プログラマー向けのObject Cクイックマイグレーションガイドの本を書いています。