Objective-CとC#の違いは何ですか?[閉まっている]


87

最近Macを購入し、主にVMWare FusionでのC#開発に使用しています。すべての素晴らしいMacアプリケーションについて、私はXcodeがインストールクリックだけで潜んでいることを考え始め、Objective-Cを学び始めました。

おそらくObjective-Cの起源はCであり、C#の起源はJava / C ++であるため、2つの言語間の構文は非常に異なって見えます。ただし、さまざまな構文を学習できるため、問題ありません。

私の主な関心事は、言語の操作と、それが適切に構造化された、読みやすくエレガントなコードを生成するのに役立つかどうかです。C#でLINQやvarなどの機能を本当に楽しんでおり、Objective-Cに同等またはより良い/異なる機能があるかどうか疑問に思っています。

Objective-Cで開発できない言語機能は何ですか?どのような機能が得られますか?

編集:フレームワークの比較は有用で興味深いですが、言語の比較はこの質問が実際に求めているものです(部分的に、最初にでタグ付けしたことに対する私の過ち.net)。おそらく、Cocoaと.NETはどちらもそれ自体が非常にリッチなフレームワークであり、どちらもMac OS Xと他のWindowsをターゲットとするという目的を持っています。

これまでに考え抜かれた、合理的にバランスのとれた視点をありがとう!


27
Xcodeは完璧ではありませんが、確かに強力で便利な機能がたくさんあります。それをバックアップしたり、比較のためのコンテキストを提供したりせずに、何かを「純粋な悪」として軽蔑することは、誰にとっても助けにならないFUDです。いずれにせよ、それは質問とは無関係です。
クインテイラー

11
Xcode 3.2は、エレガントなブレークポイント処理、静的分析、インラインエラーメッセージ、その他の機能を備えた、私が今まで使った中で最高のIDEです。ところで、それは「Xcode」ではなく「Xcode」です。@ネイサン、私はなぜ言語についての議論の中で、正当な理由なしに「純粋な悪」と呼んでXcodeを非難する必要があるのか​​本当にわかりません。
PlagueHammer

6
Objective-Cを使用することで得られる大きなことの1つは、Cocoaフレームワークにアクセスできることです。また、C、C#、Java、およびC ++はすべて、共通の構文上の遺産を共有しています。Objective-Cはその構文をSmalltalkから取得します。
Amok、

4
VM#Fusionを使用してC#で作業しますか?MonoとMonodevelop(MacとLinuxで動作する.NETとVisual Studioのオープンソースバージョンです)を使用するだけです。Monoを使用すると、C#を使用してMacとiPhoneのアプリケーションを作成できます。 ...
Robin Heggelund Hansen 2012

5
@ user668039 15年間のC#の使用経験?2001年に発売!
Ian Newson

回答:


89

すべてのタスクに最適な言語はなく、Objective-Cも例外ではありませんが、非常に具体的な優れた点がいくつかあります。LINQandの使用var(直接の置き換えを認識していない)と同様に、これらの一部は厳密に言語に関連しており、その他はフレームワークに関連しています。

注: C#が.NETと密接に結合しているように、Objective-CはCocoaと密接に結合しています。そのため、私の指摘の一部はObjective-Cとは無関係に見えるかもしれませんが、CocoaなしのObjective-Cは.NETなしのC#と似ています/ WPF / LINQ、Monoの下での実行など。これは通常の方法ではありません。)

違い、長所、短所を完全に詳しく説明するふりはしませんが、心に浮かぶものをいくつか紹介します。

  • Objective-Cの優れた点の1つは動的な性質です。メソッドを呼び出すのではなく、ランタイムが動的にルーティングするメッセージを送信します。動的なタイピングと(慎重に)組み合わせると、多くの強力なパターンを実装するのがより簡単になります。

  • Objective-Cは、Cの厳密なスーパーセットとして、自分が何をしているか知っていると信頼しています。C#やJavaなどの言語のマネージドアプローチやタイプセーフアプローチとは異なり、Objective-Cでは、必要なことを実行して結果を体験できます。明らかにこれは危険な場合がありますが、この言語がほとんどのことを積極的に妨げないという事実は非常に強力です。(編集: C#にも「安全でない」機能と機能があることを明確にする必要がありますが、それらのデフォルトの動作はマネージコードであり、明示的にオプトアウトする必要があります。比較すると、Java はタイプセーフコードのみを許可し、生のポインターを決して公開しません。 Cや他の人がする方法)

  • カテゴリ(サブクラス化もソースへのアクセスもないクラスのメソッドの追加/変更)は、素晴らしい両刃の剣です。継承階層を大幅に簡略化してコードを排除することができますが、何か奇妙なことをすると、結果が不可解になることがあります。

  • Cocoaを使用すると、多くの点でGUIアプリの作成がはるかに簡単になりますが、パラダイムに頭を抱える必要があります。MVCのデザインはCocoaに広く普及しており、デリゲート、通知、マルチスレッドGUIアプリなどのパターンはObjective-Cに適しています。

  • Cocoaバインディングとキー値の監視により、大量のグルーコードを排除でき、Cocoaフレームワークはこれを広範囲に活用します。Objective-Cの動的ディスパッチはこれと連動して機能するため、キー値に準拠している限り、オブジェクトのタイプは重要ではありません。

  • ジェネリックと名前空間を見逃す可能性が高く、それらには利点がありますが、Objective-Cの考え方とパラダイムでは、それらは必要なものというよりはむしろ便利なものです。(ジェネリックはすべて型の安全性とキャストの回避を目的としていますが、Objective-Cの動的型付けにより、これは本質的に問題になりません。名前空間が適切に機能すればいいのですが、コストが明らかにメリットを上回る競合を回避するのに十分簡単です。レガシーコード用。)

  • 並行性に関しては、Blocks(Snow Leopardの新しい言語機能であり、多数のCocoa APIに実装されています)は非常に役立ちます。数行(頻繁に10.6のlibsystemの一部であるGrand Central Dispatchと組み合わされる)は、コールバック関数やコンテキストなどの重要な定型を排除できます(ブロックはCおよびC ++でも使用でき、C#に確実に追加できます。 NSOperationQueueは、GNSが1つ以上の異なるスレッドで自動的に実行するカスタムNSOperationサブクラスまたは匿名ブロックをディスパッチすることにより、独自のコードに同時実行性を追加する非常に便利な方法でもあります。


7
技術的には、C#には、ObjCが行う型セーフでない電源機能がすべて備わっていますalloca。簡単にアクセスできるようにはなりません-明示的にオプトインする必要があります。
Pavel Minaev

8
Objective-Cでのプログラミングの魅力のほとんどはCocoaフレームワークに起因するので、私は単にCocoaについて言及します。.NETやWPFがなければ、C#は興味深いでしょうか。質問者は特にLINQについて言及していたため、彼は明らかに言語を超えて、経験に目を向けています。
クインテイラー

7
結構です。私はC#との戦いをしようとしているのではありません。Windowsソフトウェアを作成する必要がある場合は、それを使用します。言語と関連ツールの類似点と相違点を指摘するだけです。あなたは非常に明らかにC#の経験があり、私はObjective-Cの経験があります。あなたの説明に感謝しますが、おそらくより建設的な答えと髪の毛の分割が最も役立つでしょう。
クインテイラー

11
クイン、髪を割るのではありません。言語の比較から始まったことは、あなたの返答のある時点で、Cocoaがどのように優れているかについての一般的な議論になったことを指摘しました。Cocoaに関するあなたのポイントは比較ではないことを指摘したいと思います-彼らは「それはXをうまくやっている」と言っています-そしてそれは事実かもしれません-しかし彼らは「XはC#+よりも良い/悪い」とは言いませんWPF」、それは問題が広くについてであるものです。
Pavel Minaev

6
+1優れた回答Quinn
h4xxr

54

私はC、C ++、C#でプログラミングを20年以上続けています。最初は1990年に始まりました。iPhoneの開発とXcodeとObjective-Cを見てみることにしました。私の良さ...私が取り戻すMicrosoftに関するすべての不満は、コードがいかにひどいものかを今理解しています。Objective-Cは、C#に比べて複雑すぎます。私はC#に甘やかされて、今ではMicrosoftが行ったすべてのハードワークに感謝します。Objective-Cをメソッド呼び出しで読むだけでは読みにくいです。C#はこれでエレガントです。それは私の意見にすぎません。アップルの開発言語がアップル製品として優れていることを願っていますが、親愛なる、彼らはマイクロソフトから多くを学ぶことができます。間違いなく、C#.NETアプリケーションは、XCode Objective-Cよりも何倍も速くアプリケーションを稼働させることができます。Appleは確かにここでMicrosoftの本から一枚の葉っぱを取り除くべきであり、そうすれば私たちは完璧な環境を手にするでしょう。:-)


47
iPhone開発の本をちらっと見ても、20年の経験があるプラットフォームでアプリをより速く作成できますか?すばらしい
kubi

25
私はWazとまったく同じ経験をしています。また、私は客観C.を習い始めました後に、Microsoftは、C#などのVisual Studioなどの開発ツールに入れている仕事のためのより多くの感謝
ルネ・

4
それは、c#と比較して、objective-c、overcomplexityを研究している間の私の経験でもありました。@ alexy13元のメッセージのcおよびc ++のどの部分を見逃しましたか?ある言語のファミリで数十年の経験があることは、LOTが同じファミリの別の言語で同じ仕事をするのがどれほど難しいかを評価するのに役立ちます。
アンダーソンフォルタレザ

5
このトップアンサーはどうですか?それは簡潔な答えではなく、彼が一夜にして学んだいくつかの言語と20年以上使用してきた言語の明確に偏った意見です...明らかに、新しい言語に習熟することはできません
Heavy_Bullets '17

3
"Just reading Objective-C with method invokes is difficult to read"-ここは、Obj-Cの短所としてここで言及された非常に主観的な議論の1つです。他のすべては単に論争の的になるレトリックです。
スカイワインダー2014年

46

ここには技術的なレビューはありませんが、Objective-Cの読みやすさがはるかに劣っています。Cinder6があなたに与えた例を考えると:

C#

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)

Objective-C

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

ひどいですね。私はその上で2冊の本を読んでみましたが、彼らは早い段階で私を失いました、そして通常私はプログラミングの本/言語でそれを取得しません。

私がMac OS用のMonoを手に入れられて嬉しいです。なぜなら、もし私がAppleに頼らなければならないのであれば、良い開発環境を提供してくれるからです...


17
1行目が[NSMutableArray array]代わりに(メモリリーク)で終わり、4行目がNSString* xorまたはid x(コンパイルエラー)で始まるという事実を無視して...はい、Objective-Cにはジェネリックがありません(正直、見逃しません)。配列構文でオブジェクトにインデックスを付けないでください。APIは一般により冗長です。to-may-to、mah-to。それは本当にあなたが見たいものに帰着します。(C ++ STLで同じコードを書くことができ、それは恐ろしいものだったと思います。)私にとって、読み取り可能なコードは、コードのテキストがそれが何をしているかを伝えることを意味することが多いため、Objective-Cコードが望ましいです。
クインテイラー

18
構文自体に問題はありません- 読みづらいと感じる主な理由は、1)Cバックグラウンドから来たすべての人にはなじみがないこと、および2)プレーンなC構造の真ん中で使用されているためです。エイリアンに見えます。一方、Smalltalkishの名前付きパラメーター(メソッドの一部としての名前)を使用すると、実際に呼び出しがわかりやすくなります。実際には、あなたのC#のコードサンプルはよくこれを示して-それがコンパイルされません、ので、List<T>.Remove取り文字列を引数として、最初occurenceofその文字列を削除します。インデックスで削除するには、が必要RemoveAtです。
Pavel Minaev

12
...を備えたObjCバージョンはremoveObjectAtIndex:、より冗長ですが、その機能についても明確です。
Pavel Minaev

6
すばらしい点、パベル。また、少なくとも私にとっては、不一致strings[0]strings.RemoveAt(0)明快さを損なうものです。(また、メソッド名が大文字で始まる場合、常に私を悩ませます...それはマイナーな小刻みであることがわかっていますが、それは奇妙です。)
Quinn Taylor

4
私の場合、多くの人にとって、「ツール」の読みやすさが私の生産性に影響を与えます。私は多くの言語で快適で生産的ですObjective-Cはそれらの言語の1つではありませんでした。しかし、繰り返しになりますが、結局のところ、それはすべて個人的な好みです。20年前とは異なり、プラットフォームYをターゲットにするために言語Xを使用する必要はありません。最適なものを選択します。
TimothyP 2014

17

手動のメモリ管理は、Objective-Cの初心者にとって最も問題があるように思われます。これは、主に、それが実際よりも複雑であると考えているためです。

Objective-CとCocoaの拡張は、強制よりも規約に依存しています。非常に小さなルールのセットを知って、それに従ってください。ダイナミックランタイムによって、多くのものが無料で提供されます。

100%の真のルールではありませんが、日常的には十分です。

  • へのすべての呼び出しは、現在のスコープの最後にあるallocaと一致する必要がありreleaseます。
  • メソッドの戻り値がによって取得されている場合、allocによってreturn [value autorelease];照合されるのではなく、によって返されreleaseます。
  • プロパティを使用します。ルール3はありません。

より長い説明が続きます。

メモリ管理は所有権に基づいています。唯一のオブジェクトインスタンスの所有者がこれまでにオブジェクトを解放する必要があり、誰も他には常に何もしないはずです。つまり、すべてのコードの95%で、Objective-Cをガベージコレクションされたものとして扱います。

では、残りの5%はどうでしょうか。注意すべき3つのメソッドがあります。これらのメソッドから受け取ったオブジェクトインスタンスは、現在のメソッドスコープによって所有されています

  • alloc
  • or など、newという単語で始まるメソッド。newnewService
  • copyand などの単語のコピーを含むメソッドmutableCopy

メソッドには、終了する前に、所有されているオブジェクトインスタンスをどのように処理するかについて、3つの可能なオプションがあります。

  • release不要になった場合は、を使用して解放してください。
  • フィールド(インスタンス変数)またはグローバル変数に割り当てるだけで、所有権を付与できます。
  • 所有権を放棄しますが、を呼び出してインスタンスが消える前に、誰かに所有権を取得する機会を与えますautorelease

では、いつ電話をかけて積極的に所有権を取得する必要がありますretainか?2つのケース:

  • 初期化子でフィールドを割り当てるとき。
  • setterメソッドを手動で実装する場合。

2
+1すばらしい要約。私がC年前に学んだときと非常によく似ています。
Alex Angas

4
明確にするために、ガベージコレクションはMac上のObjective-Cで完全にサポートされており、手動のメモリ管理を行う必要はありません。手動メモリ管理はiOSでのみ必要です。
PlagueHammer

3
それでも、必要なときにパフォーマンスを向上させるためにのみ、ガベージコレクションを実行する必要がない場合は、メモリ管理の基本を学ぶことをお勧めします。
FeifanZ

3
iOS 5ではARCが導入され、割り当てられたオブジェクトを手動で解放する必要がなくなりました。しかし、C#ほど簡単ではありません。Objective-Cは20年以上前のものであり、当時の言語の要件の一部を保持していることを覚えておく必要があります。C#はこれをすべて削除しました。そうは言っても、CocoaにはまだWindows Phoneでアクセスできるようになっていない多くのAPIがあります。ジェスチャー、UIイベントなどに関してははるかに多くのコントロールなど
jyavenard

10

確かに、あなたが人生で見たすべてがObjective Cである場合、その構文は唯一可能なもののように見えます。私たちはあなたを「プログラミングの処女」と呼ぶことができます。

しかし、多くのコードはC、C ++、Java、JavaScript、Pascal、およびその他の言語で記述されているため、ObjectiveCはそれらすべてとは異なりますが、良い点は異なります。これには理由がありましたか?他の一般的な言語を見てみましょう:

C ++はCに多くの追加機能を追加しましたが、元の構文を必要なだけ変更しました。

C#はC ++に比べて多くの追加機能を追加しましたが、C ++で醜いもののみを変更しました(「::」をインターフェイスから削除するなど)。

Javaは多くの点を変更しましたが、変更が必要な部分を除いて、使い慣れた構文を維持しました。

JavaScriptは完全に動的な言語であり、ObjectiveCではできない多くのことができます。それでも、その作成者は、メソッドを呼び出してパラメーターを渡す新しい方法を発明しただけで、他の世界とは異なります。

Visual Basicは、ObjectiveCと同様に、パラメーターを順不同で渡すことができます。パラメータに名前を付けることができますが、通常の方法で渡すこともできます。何を使っても、それは誰もが理解できる通常のカンマ区切りの方法です。カンマは通常の区切り文字であり、プログラミング言語だけでなく、本、新聞、一般的に書かれた言語でも使用されます。

Object Pascalの構文はCとは異なりますが、その構文は実際にはプログラマーのために読むのが簡単です(多分、コンピューターではなく、コンピューターが何を考えているかを気にする人)。おそらく彼らは脱線したかもしれませんが、少なくとも彼らの結果はより良いです。

Pythonには異なる構文があり、Pascalよりも(人間にとって)読みやすくなっています。したがって、彼らがそれを変更してそれを変えたとき、少なくとも彼らは私たちのプログラマーにとってそれをより良くしました。

そして、ObjectiveCがあります。Cにいくつかの改善を加えますが、独自のインターフェース構文、メソッド呼び出し、パラメーター受け渡しなどを発明します。なぜ+と-を入れ替えなかったのでしょうか?それはもっと涼しかったでしょう。

Steve JobsはObjectiveCをサポートすることで失敗しました。もちろん、彼はC#をサポートすることはできません。これは優れていますが、彼の最悪のライバルです。したがって、これは政治的な決定であり、実際的な決定ではありません。政治的な理由で技術的な決定が下されると、技術は常に影響を受けます。彼は会社をリードし、良いことをし、プログラミングの問題は実際の専門家に任せるべきです。

ObjectiveC以外の言語でiOSおよびサポートライブラリを作成することを決めた場合、iPhone用のアプリはさらに増えると思います。熱心なファン、バージンプログラマー、スティーブジョブズを除くすべての人にとって、ObjectiveCはばかげて、醜く、不快に見えます。


3
最後の2パラグラフはそれをすべて合計します
ザコス

確かに構文はばかげているように見えますが、Objective-C言語の逸品は、すべての言語のリフレクションを使用するのが最も簡単で、いくつかのパラダイムを実装するのがほとんど簡単な、非常に優れたランタイム機能があることです。たとえば、Objective-Cを使用する場合、使用する線形テーブルを気にする必要はありません-リンクリストまたはベクトルなどNSArray、マシンとデータの性質に基づいて最適なアルゴリズムの選択を処理します。
Maxthon Chan 2014

Objective-CでiOSアプリのユーザーインターフェイスを実装する(未経験の)プログラマーとして、最初の仕事に入りました。私が今(3年後)欲しいのは、その孤独な「島」を抜け出し、プラットフォームに依存しない、したがってより独創的な何かを学ぶことです。また、他のフレームワークも非常に迅速に更新されるかどうか、そしてバグがあるかどうかを知るためにも。おい!新機能!- クラッシュ ...(ドイツ語の)ジョブセンターが、Appleのsh * t向けに開発する必要がなくなったため、JavaやC ++ / C#のチュートリアルにお金を費やしてほしい。
anneblue 2016

5

Objective-Cで気に入っている点の1つは、オブジェクトシステムがメッセージに基づいていることです。これにより、C#では実行できなかった非常に優れた操作を実行できます(少なくとも動的キーワードがサポートされるまでは!)。

Cocoaアプリを作成するもう1つの素晴らしい点は、Interface Builderです。これは、Visual Studioのフォームデザイナーよりもはるかに優れています。

(C#開発者として)私を困らせているobj-cについてのことは、自分のメモリを管理する必要があるという事実です(ガベージコレクションはありますが、それはiPhoneでは機能しません)。セレクター構文とすべての[]。


2
dynamic途中までしか取得できません-メッセージの委任などの些細なことでも、真の動的オブジェクトの実装は、C#4.0でも面倒です。一方、ObjCを通過する柔軟性のある真の動的メッセージの代償は、型安全性を失うことです。
Pavel Minaev

3
Objective-Cではオプトインの静的型付けが可能であることを指摘する価値があります。これにより、型の安全性が大幅に向上します。コンパイル時チェックを好む人もいれば、実行時チェックを好む人もいます。(両方の言語で)良い点は、選択が絶対的なものである必要がないことです。
クインテイラー

3
Windowsが...デザイナーがそれほど大きくないフォームが、あなたは(.NET 3.0のような)Expression BlendのをWPFを使用することができます場合は打ちにくいです
ネイト

System.ReflectionC#3.0の拡張機能と組み合わせると、これの多くを行うことができます。見つけた任意のメソッドを呼び出すことができますが、本当のメッセージパッシングではありません。obj.PassMessage("function_name", params object[] args);言語に統合されたより優れたメッセージパッシングのように見えます。通常のオブジェクトで呼び出し可能なメソッドがありません。必要。
フィリップクンク、2011年

4

C#4.0以降のObjective-C for iPhoneを使い始めたばかりのプログラマーには、ラムダ式、特にLinq-to-XMLがありません。ラムダ式はC#固有ですが、Linq-to-XMLは.NETとCocoaの違いです。私が書いていたサンプルアプリでは、文字列にXMLが含まれていました。そのXMLの要素をオブジェクトのコレクションに解析したかったのです。

Objective-C / Cocoaでこれを実現するには、NSXmlParserクラスを使用する必要がありました。このクラスは、要素のオープンタグが読み取られたとき、データが読み取られたとき(通常は要素内)、および要素の終了タグが読み取られたときに呼び出されるメソッド(読み取り:メッセージの送信)でNSXMLParserDelegateプロトコルを実装する別のオブジェクトに依存します。 。解析のステータスと状態を追跡する必要があります。そして正直なところ、XMLが無効な場合にどうなるかわかりません。詳細に到達してパフォーマンスを最適化するのに最適ですが、まあ、それはコードの全量です。

対照的に、C#のコードは次のとおりです。

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

これで、XMLから描画されたカスタムオブジェクトのコレクションができました。これらの要素を値でフィルタリングしたい場合、または特定の属性を含む要素のみにフィルタリングしたい場合、または最初の5つだけを要求したり、最初の1つをスキップして次の3つを取得したり、要素が返されたかどうかを確認したりする場合... BAM、すべて同じコード行にあります。

Objective-Cでこの処理を非常に簡単にするオープンソースのクラスはたくさんあります。そのため、面倒な作業の多くが行われます。これだけではありません。

*注:上記のコードは実際にはコンパイルしていません。これは、C#で必要とされる冗長性が比較的不足していることを示すための例にすぎません。


ただし、ここでは重要ではありませんが、この比較ではC#の部分に「冗長性の欠如」はそれほど多くなく、XMLの解析に使用している.netフレームワーククラスに冗長性が含まれているだけです。それらの中のコードを調べると、かなり多くのC#コードが見つかる可能性があります。
XIVSolutions

3

おそらく最も重要な違いはメモリ管理です。C#では、CLRベースの言語であるため、ガベージコレクションを利用できます。Objective-Cでは、メモリを自分で管理する必要があります。

C#のバックグラウンド(または、最新の任意の言語)を使用している場合、自動メモリ管理を行わない言語に移行するのは、メモリの適切な管理(およびデバッグ)上手)。


6
ObjCは最近、ガベージコレクションを追跡しています。一方、C#では、必要に応じてメモリを自分で管理できます(生のポインターのおかげです)。
Pavel Minaev

3
Objective-C(Appleのフレームワークのコンテキスト)での手動のメモリ管理はそれほど負担ではないと思います。保持/解放/自動解放サイクルは、CおよびC ++の「従来の」メモリ管理よりもはるかに煩雑ではありません。
mipadi

5
これは本当のDSOではありません。iPhoneのようなガベージコレクション以外の環境でも、保持/解放および自動解放の処理にかかる時間は約10分で、問題はありません。メモリ管理の課題を誇張したいC#-erをたくさん見つけました。それは彼らがそうでなければobj-cが好きになりすぎるのを恐れるようなものです...;)
h4xxr

4
手動メモリ管理の基本は難しくありません。ただし、割り当てられたオブジェクトの受け渡しを開始し、複雑なオブジェクトグラフを処理する必要がある場合は、誰がいつ解放するのかというルールを注意深く守る必要があるため、非常に複雑になります。参照カウントの実装は、オブジェクトグラフのサイクルを処理する必要があることを除いて、それをいくらか簡単にします... C#と比較すると、このIMOのすべてが大きな違いです。
DSO

1

2つの言語を比較したかなり良い記事を以下に示します。http//www.coderetard.com/2008/03/16/c-vs-objective-c/


ページがUTF-8であると主張するのは残念ですが、アポストロフィと引用符のあらゆる種類の厄介な置換があります。彼の文章は「曲がりくねった」引用符を使用していると思いますが、コードは文字化けします...
クイン・テイラー

彼らはイントロ全体を盗んだように見えますが、ソース記事でさえコードが変更されています。どちらも特に素晴らしい記事ではありません。
dnord

-2

2つの言語のパラダイムの違いを除いて、大きな違いはありません。私が言いたくないのは、Objective-CとCocoaでできるのと同じ種類のことです(おそらくそれほど簡単ではありません)。あなたがいないので、ヒョウのように、Objective-Cの2.0は、ガベージコレクションを持っていあなたがする場合を除き、メモリを自分で管理するために、(古いMacとiPhoneアプリケーションとコードの互換性にしたい2つの理由です)。

構造化された読み取り可能なコードに関する限り、他の言語と同様に、プログラマの負担の多くはプログラマにあります。ただし、関数/メソッドに適切に名前を付ければ(他の言語と同じように)、メッセージパッシングパラダイムが読み取り可能なコードに適していることがわかります。

私はC#や.NETに詳しくないことを最初に認めます。しかし、上記のクインの理由は、私がそうなりたくないと思うかなりの数の理由です。


-3

obj-cで使用されるメソッド呼び出しはコードの読み取りを容易にします。私の意見では、c#よりもはるかにエレガントで、obj-cはcの上に構築されているため、すべてのcコードはobj-cで正常に機能します。私にとっての最大の売り手は、obj-cがオープンスタンダードであるため、あらゆるシステムのコンパイラを見つけることができるということです。


2
ISO C#もオープンスタンダードです。また、私が知る限り、存在する唯一のObjCコンパイラはgccです。
Pavel Minaev

@Pavel:ポータブルオブジェクトコンパイラ(users.telenet.be/stes/compiler.html)とclangもあります。
mipadi

1
実際には、GCCはもはや唯一のコンパイラではありません。ClangとLLVMは、GCCに取って代わり、JITコンパイルなど不可能だったことができるように設計および開発されたテクノロジーのペアです。これはSnow LeopardのOpenCLの中核です。他の言語にも拡張可能であり、チェックする価値があります。
Quinn Taylor、

2
私は正直、移植性をObjective-Cのプロだとは考えていません。むしろ、長所は、同じタスクを実行するための迅速な開発とコード量の削減に沿ったものです。
クインテイラー

コンパイラの可用性に関する私の間違いを修正していただきありがとうございます。まあ、とにかく移植性は技術的にそこにあります-たとえば、Win32でMinGW / ObjCをうまく使用できます-その意味で、gcc自体と同じように移植可能です。もちろん、ライブラリは存在しません(ただし... GnuStep / Win32はありますか?)。ただし、この状況は、Monoの場合よりもそれほど深刻ではありません。全体として、移植性はどちらにとっても重要なポイントではないと思います。
Pavel Minaev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.