Objective-Cを学ぶ前に最初にCを学ぶ[終了]


107

私は野心的なApple開発者であり、Objective-C、そして最終的にはCocoaフレームワークに移行する前に、まずCを学ぶ方がよいのであれば、コミュニティの意見を聞きたいと思います。

私の直感は、Cを学ぶと言っています。

回答:


163

最初に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 ++を知っていて、iPhone / iTouch開発用のObjective-Cを学びたい場合、Cを何でも学ぶ必要はありますか?
chester89

11
@ chester89:C ++をすでに知っている場合は、Objective-Cを使い始めるのに十分なCについて知っています。
Sven

Svenは正解です。C++は非常に複雑で、すでに純粋なCの多くを使用しています。C++を本当によく知っている場合は、Cも十分に知っている必要があります。
Mecki

これは、このトピックについての私のお気に入りの考えですが、ありがとうございます。
Morkrom、2013

1
@FrederikWitte C ++を省略します。初心者として混乱するだけです(モバイル開発に必要な言語ではありません)。Javaから始めてください。Javaは優れた教育言語であり、Javaを理解するだけでAndroid向けに開発できます(おそらく、ゲームやビデオプレーヤーなどを書きたくない限り)。次に、代わりにCを学び、最後にObj-Cを学びます。あなたの選択。
メッキー2015年

25

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の経歴を持っていました。 )


2
最初にCを学ぶ必要は絶対にないはずです。特に、JavaのC#などの言語をすでに知っている場合はなおさらです。C#とJavaは、客観的なCに大きく依存しています。
ダニエルHonigの

18

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の機能のすべてではなくてもほとんどを学びたいと思うことに同意しますが、クラスとメソッドの定義、オブジェクトとメッセージ式の操作、および継承とポリモーフィズムはよく理解されています。


このすべては、苦労と深い理解を避けながら、早く学びたい人のためのものです。私は完全なプログラミング初心者(11年以上のプログラミング経験があります)を教え、以前は他の人に教えていました(しかし、それを明確にするための教師ではありません)。そして、何を知っていますか?私たちが慣れ親しんでいるこのすべての概念は非常に複雑で、完全な初心者には直感的ではありません。Cは十分に低いレベルのものを理解するための素晴らしい方法です。そのため、将来的にはCは魔法のようにはなりません。とは言っても、より良いプログラマーにとっては、最初はCの方が野蛮なルールで学習曲線が良くなります=)
MANIAK_dobrii 14

15

私はObjective Cについて詳しく説明します。すでにいくつかの言語を理解しているのであれば、それは構文ではなく学習曲線です。Cocoaです。


1
これで、Cの学習に利用できる資料が増えました。ObjCの最も難しい部分であることがわかりました。よく整理された明確な資料がなく、CまたはC ++資料と比較して、何が何であったかを理解するのに十分な深さがありました。その中で起こっています。
Spanky

10

ほとんどの場合、Cを学ぶことは、どのような分野に行っても、少なくともパッケージ化された商品を使用する前にソフトウェア開発の内部の仕組みを理解し、何か問題が発生した場合に備えておくとよいでしょう。あなたは内部の仕組みを理解するより良いチャンスがあります。SOについてはこれについて多くの議論があり、それはかなり主観的な質問ですが、一般的にはObjective-Cコード内で本質的にCを使用することになるので、それは本当にあなた次第だと思います。私は根っからの人ですが、時には邪魔になることもあり、上から下に向かって働いた賢い人が何人か知っています。重要な部分は、内部の仕組みを理解することです。自分の能力を、そうでない者とは別に設定し、能力を向上させます。


Cを最初に学習すると、OOプログラミングの基礎がまだない場合、OOプログラミングの見方がゆがむ可能性があります。構造化コーディングと手続き型コーディングを混在させるのはよくありません。しかし、OOは、Cが優れている多くの場所(低レベルのコードを書くなど)でその価値を失うことも事実です。
Daniel Honig

1
すべての開発者にCを学ぶように勧める理由は、少なくともOO言語でさえ、最終的にCが実行するのとまったく同じ命令にコンパイルされるという考えに基づいています。オブジェクトの変数はポインターを使用し、ガベージコレクターはmallocおよびfreeを使用し、ファイルはOSハンドルを使用してロックされます。JavaまたはC#アプリケーションで問題が発生した場合、これらの基本を理解することで、問題の理解を大幅に向上させることができます。実行されるリソース割り当てを理解することは、特定のコンテキストに対してより最適に実行される、より多くの情報に基づいたコードを作成することにもつながります。
TheXenocide 2012

7

Cの厳密なスーパーセットであるObjective-Cを学習する前にCを学習することをお勧めします。これは、Objective-Cがすべての通常のCコードをサポートできるため、Cプログラムに共通のコードがObjective- Cコード。

純粋に言語の観点から物事を見ることに加えて、Mac OS Xは完全なUnixオペレーティングシステムであることがわかります。すべてのシステムレベルライブラリはCで記述されています。

おそらく両方を同時に学ぶことはおそらく可能ですが、最初にCの確かな実用的な知識があれば、Objective-Cを高く評価して理解できると思います。


5

私はObjective-Cを学び、必要に応じて必要なだけCを学びます。

あまり依存しないCの領域:

  • ポインタ演算と配列。C配列はまったく使用していません。
  • C文字列。Objective-Cの文字列は、より適切かつ安全に機能します。
  • Obj-C 2.1でGCを使用する場合の手動メモリ管理。開発の速度とパフォーマンスの理由から、このルートを強くお勧めします。

6
注意点の1つ:Objective-Cのガベージコレクションは、すべてのプラットフォーム(特にiPhone)で使用できるわけではありません。
Mark Bessey、

5

Objective-CとCocoaを学習するとき、Cのビットの学習を避けることはできません。たとえば、長方形は一般的にC構造体であるCGRectで表されます。

時間があれば、ぜひCを学んでください。ここで他の人が言ったように、Kochanの本(第2版と第1版)は、読むのに最適な本です。


4

Objective-Cで純粋に実行できないことはたくさんあるので、いくつかの基本的なCスキルを学ぶことは非常に重要です。少なくとも、変数宣言と基本的なCライブラリ関数を理解する必要があります。そうしないと、イライラします。


3

正直なところ、多くの言語はC構文に基づいているので、慣れるのは良いことです。Cに慣れるまでに1〜2週間かかります。

そうは言っても、私は自分にObjective Cを教えただけで、正直に言う必要があります。Cの経験が思ったほど役に立たなかったのです。Objective Cは私にとって間違いなく目を見張るものでした。


3

Objective-Cに直接ジャンプでき、次の利点があります。

  1. 途中で「一部の」Cを学習します。
  2. 自分に関係のあるCパーツを学びます。

少なくとも私にとっては、特定のアプリやサンプルに興味があると、新しい言語を習得するのが簡単になり、自分が興味をそそるもの以外のことを学ぶ必要があると失敗します。

下位レベルのプログラミングに興味がある場合は、いつでもCの知識を磨くことができます。


3

Objective-Cに慣れていないので、よくわかりません。
しかし、Cのベースは習得が難しくなく、非常に複雑な言語ではありません(マスタリングの観点からではなく、構文の観点から!)。そのため、それを試してみれば、時間の無駄になりません。
個人的には、Cを学ぶことは常に良い考えだと思います、それはコンピュータがどのように機能するかについての良い洞察を与えます。結局のところ、ほとんどの言語とシステムはまだCで書かれています。次に進んでください!:-)

PS .:「先に進む」とは、「落とす」という意味ではなく、単に「もっと学び、違うことを学ぶ」という意味です。Cを知ったら決して落とさないかもしれません。JavaはJNIを使​​用して低レベルのもののCルーチンを呼び出し、Python、LuaなどはCコードで拡張されることがよくあります(Lua参照は、背後にあるC関数への薄いラッパーなど)。



2

Wikipediaによると、Objective-CはCの厳密なスーパーセットです。これが事実であり、最初にCを学ぶことをお勧めします。次に、Objective-Cを学習すると、Objective-Cの一部として追加されるパーツが明確になります。


2

Cは、アセンブリからの抽象化をほとんど提供しません。一部のCコンパイラでは、インラインアセンブリまで使用できます。これは、コンピュータがどのように機能するかを考えるのに非常に役立ちます。

そうは言っても、もし本当にObject-Cに興味があるなら、Cで何かを書くのに困らないようにしてください。新しいスキルセットを習得しようとしている間、自分を苛立たせる必要はありません。自分がやっていることを楽しんでいることが重要です。



2

目的Cは、Cを最初に学習する価値がないほどCとは十分に異なります。

シンタックス/言語ファミリの観点から見ると、SmallTalk(目的Cが基づいている)を勉強する方がほとんど得策です。

実践的な観点からは、一度に1つの言語を学ぶことに集中してください。

その後、別の言語を学びたい場合、C ++、Java、Pythonは1)束として簡単に習得できます2)人気があり、市場性がある3)強力です。


1
いいえ、Objective-CはCの非常に小さなスーパーセットです。Cがないと、Objective-Cで何も実行できません。確かに、オブジェクトモデルはsmalltalkから取得されていますが、構文はほとんどの部分で近接していません。
Sven

2

Objective_Cを開始する前にCの基本的な知識が必要ですが、Cのすべての詳細をマスターする必要はありません。

「Objective-Cでのプログラミング」を読んだ後、他の人を助けるためにノートを公開しました。

プログラミングで目的cを学ぶ


1

すでに知っている多くの言語によっては、Objective-Cの学習を始めるだけの方が良いかもしれません。ほとんどの言語の基礎は基本的に同じですが、異なるのは構文です。Objective-Cの学習に関しては、Cを最初に学習しても、それほど大きな違いはありません。


ただし、他のプログラミング言語を少なくとも1つ知っている場合に限ります。
Sven


1

私はObjective-Cをすぐに習得し、約1年間問題なく動作しました。プロジェクトをダウンロードして動作を確認するときにCコードを読むのに苦労しましたが、今はCを学ぶ必要性を本当に感じています。 CなしのObjCですが、遅かれ早かれ、Cが必要になります。


1

私見1つはまず、少なくともいくつかのCについて、特にポインターについて学ぶべきです。ポインタを持たない言語からのものである場合、それはさらに重要です。多くの人が次のようなコードについて尋ねます

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

彼らはポインタとそれが指すオブジェクトの違いを知らないからです。

もちろん、Objective-Cを始める前にCのすべてを学ぶ必要はありませんが、いくつかの基本的なことが絶対に必要です。


+10に投票できたらいいのに。obj-c devのインタビューで、NSIntegerへのポインターを作成することが可能かどうか尋ねられました...私にはショックを受けました。これは重要であり、これも理解する必要があることを忘れがちです。
MANIAK_dobrii 14

0

いやいや、目的Cに直行!

私はActionScript 3からObjective Cに移行しましたが、会社にすでにインターンがいます!

やりたいことをしてください。


オブジェクト指向の精神状態を完全に見逃して、最初にCの学習を開始するのはなぜですか?凧を操ることを学び、パイロットになることを望んでいるようなものです。最初からOOPを統合する必要があります。
SwiftArchitect 2015

0

以前に他の言語を学習している場合、正しい構文を書くことは常に混乱します。目的はわかりませんが、オブジェクトCは奇妙な(一般的ではない)構文を使用してオブジェクトメソッドを呼び出します。それはそれをメッセージの送信と名付けています、そうです、それに応じて純粋なオブジェクト指向の概念は真実ですが、ほとんどのオブジェクト指向言語はそれを呼び出しメソッドと呼び、より伝統的な呼び出しメソッドの構文を使用します。ガベージコレクションも非常に奇妙です。オブジェクトCは古い学校の参照カウントに基づいています。したがって、他の言語から切り替えると、それを受け入れるのが困難になります。私は、C / C ++プログラマー向けのObject Cクイックマイグレーションガイドの本を書いています。


Objective-Cでは、「メッセージの送信」は「メソッドの呼び出し」ではありませんが、同時にメッセージを送信するとメソッドが呼び出されます(関数)=)オブジェクトにメッセージを送信すると、メッセージディスパッチが行われますメカニズム(あなたはそれについてここで読むことができます:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…またはここ:stackoverflow.com/questions/982116/…
MANIAK_dobrii 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.