Як Objective-C порівнюється з C #? [зачинено]


87

Нещодавно я придбав Mac і використовую його в основному для розробки C # під VMWare Fusion. З усіма приємними додатками для Mac навколо, я почав думати про те, щоб Xcode причаївся лише за клацанням миші та вивчив Objective-C.

Синтаксис між двома мовами виглядає дуже по-різному, мабуть, тому, що Objective-C бере свій початок з C, а C # - у Java / C ++. Але можна вивчити різні синтаксиси, так що це повинно бути нормально.

Моє головне занепокоєння - робота з мовою, і якщо це допоможе створити добре структурований, читабельний та елегантний код. Мені дуже подобаються такі функції, як LINQ та var у C #, і цікаво, чи є еквіваленти чи кращі / різні функції в Objective-C.

Які мовні особливості я буду скучати за розробкою з Objective-C? Які функції я отримаю?

Редагувати: Порівняння фреймворків є корисними та цікавими, але мовне порівняння - це те, що насправді задає це питання (частково моя вина за те, що спочатку він мітив теги .net). Імовірно, і Cocoa, і .NET самі по собі є дуже багатими фреймворками, і обидва мають своє призначення, одна націлена на Mac OS X, а інша Windows.

Дякуємо за добре продумані та обґрунтовано збалансовані точки зору на сьогодні!


27
Xcode не ідеальний, але він, безумовно, має безліч потужних і корисних функцій. Зневажати щось як "чисте зло", не створюючи резервної копії та не надаючи жодного контексту для порівняння - це ПУТ, який нікому не допомагає. У будь-якому випадку це не має значення для питання.
Quinn Taylor 02

11
Xcode 3.2 - це, мабуть, найкраща IDE, яку я коли-небудь використовував, з елегантною обробкою точок зупинки, статичним аналізом, вбудованими повідомленнями про помилки та безліччю інших функцій. До речі, це "Xcode", а не "XCode". @ Натан, я справді не розумію, чому вам потрібно зневажати Xcode, називаючи його "чистим злом" - без будь-якого обґрунтування - в дискусії про мови.
PlagueHammer 02

6
Одна велика річ, яку ви отримаєте, використовуючи Objective-C, - це те, що ви матимете доступ до рамок какао. Крім того, C, C #, Java та C ++ мають спільну синтаксичну спадщину. Objective-C отримує синтаксис від Smalltalk.
Amok,

4
Ви працюєте на C # за допомогою VMWare fusion? Просто використовуйте mono та monodevelop (це версія з відкритим вихідним кодом .NET та Visual Studio, яка працює на Mac та Linux. За допомогою Mono ви також можете створювати додатки для Mac та iPhone за допомогою C #, одночасно використовуючи бібліотеку .NET, а також Cocoa ...
Робін Геггелунд Хансен,

5
@ user668039 15-річний досвід використання C #? Вийшов у 2001 році!
Ян Ньюсон,

Відповіді:


89

Жодна мова не ідеально підходить для всіх завдань, і Objective-C не є винятком, але є кілька дуже специфічних приємностей. Як і використання LINQта var(для якого я не знаю прямої заміни), деякі з них суворо пов'язані з мовою, а інші - з фреймворком.

( ПРИМІТКА: Так само, як C # тісно пов'язаний з .NET, Objective-C тісно пов'язаний з какао. Отже, деякі мої зауваження можуть здатися не пов'язаними з Objective-C, але Objective-C без какао схожий на C # без .NET / WPF / LINQ, працює під Mono тощо. Це просто не так, як зазвичай це робиться.)

Я не буду робити вигляд, що повністю обговорюю відмінності, плюси та мінуси, але ось деякі з них нагадують мені.

  • Однією з найкращих частин Objective-C є динамічний характер - замість виклику методів ви надсилаєте повідомлення, які середовище виконання динамічно спрямовує. Поєднуючись (розумно) з динамічним набором тексту, це може зробити багато потужних шаблонів простішими або навіть тривіальними у реалізації.

  • Як сувора набір C, Objective-C довіряє, що ви знаєте, що робите. На відміну від керованого та / або безпечного для підходів мов, таких як C # та Java, Objective-C дозволяє робити те, що хочеш, і відчувати наслідки. Очевидно, що це може бути часом небезпечним, але той факт, що мова не активно заважає вам робити більшість справ, є досить потужним. ( РЕДАКТУВАТИ: я повинен пояснити, що C # також має "небезпечні" функції та функціональність, але їх поведінкою за замовчуванням є керований код, який вам потрібно явно відмовитись. Для порівняння, Java дозволяє лише безпечний код типу і ніколи не виставляє необроблені вказівники так, як це роблять С та інші.)

  • Категорії (додавання / модифікація методів у класі без підкласу чи доступу до джерела) - це приголомшливий двосічний меч. Це може значно спростити ієрархію успадкування та усунути код, але якщо ви робите щось дивне, результати іноді можуть бути незрозумілими.

  • Какао робить створення графічних програм набагато простішим у багатьох відношеннях, але вам доведеться обернутися головою навколо парадигми. Дизайн MVC широко поширений у Cocoa, і такі шаблони, як делегати, сповіщення та багатопотокові графічні програми, добре підходять для Objective-C.

  • Какао-пов’язки та спостереження за ключовими значеннями можуть усунути тонни клейового коду, і основи какао широко використовують це. Динамічне відправлення Objective-C працює паралельно з цим, тому тип об’єкта не має значення, якщо він відповідає ключовим значенням.

  • Швидше за все, ви будете сумувати за дженериками та просторами імен, і вони мають свої переваги, але в мисленні та парадигмі Objective-C вони будуть скоріше приємними, ніж необхідними. (Загальні принципи - це безпека типу та уникнення кастингу, але динамічне введення тексту в Objective-C робить це по суті не проблемою. Простори імен було б непогано, якщо зробити їх якісно, ​​але це досить просто, щоб уникнути конфліктів, оскільки вартість, безперечно, перевищує переваги, для застарілого коду.)

  • Для одночасності надзвичайно корисними є Blocks (нова мовна функція в Snow Leopard, яка впроваджена в десятках API какао). Кілька рядків (часто в поєднанні з Grand Central Dispatch, який є частиною libsystem на 10.6) може усунути значні зразки функцій зворотного виклику, контексту тощо (Блоки також можуть використовуватися в C і C ++, і, безумовно, можуть бути додані до C #, що було б приголомшливо.) NSOperationQueue - це також дуже зручний спосіб додати паралельність до власного коду, надіславши або спеціальні підкласи NSOperation, або анонімні блоки, які GCD автоматично виконує для одного або декількох різних потоків.


7
Технічно, C # має всі без тіпобезопасний силу особливості , що робить ObjC: сирі покажчики, покажчик арифметика, зв'язано-неперевірені масиви, союзи, alloca. Це просто не робить їх такими легкодоступними - вам потрібно чітко ввійти.
Павло Мінаєв 02

8
Я просто згадую про какао, оскільки більша частина привабливості програмування в Objective-C обумовлена ​​рамками какао. Чи був би C # цікавим без .NET та / або WPF? Автор запитування згадав LINQ, тому, очевидно, він переглядає не лише мову, а й досвід.
Quinn Taylor 02

7
Що добре. Я не намагаюся боротися з C #. Якби мені довелося писати програмне забезпечення Windows, я б цим користувався. Я просто намагаюся вказати на подібність та відмінності між мовами та відповідними інструментами. Ви дуже очевидно досвідченіші з C #, а я з Objective-C. Я вдячний за ваші роз'яснення, але, можливо, найбільш конструктивні відповіді та менша роздільність волосся будуть найбільш корисними.
Квін Тейлор 02

11
Це не розколювання волосся, Квінне. Я лише зазначив, що те, що почалося як порівняння мов, перетворилося на загальну дискусію про те, як добре какао, у якийсь момент у вашій відповіді. Я все-таки хотів би зазначити, що ваші зауваження щодо какао - це не порівняння - вони кажуть "це робить X добре" - і цілком може бути так - але вони не кажуть "це робить X краще / гірше, ніж C # + WPF ", саме про це в цілому йдеться.
Павло Мінаєв 02

6
+1 відмінна відповідь Квін
h4xxr 02

54

Я програмую на C, C ++ та C # зараз більше 20 років, вперше розпочавшись у 1990 році. Я щойно вирішив поглянути на розробку iPhone та Xcode та Objective-C. Боже мій ... всі скарги на Microsoft, які я беру назад, я тепер усвідомлюю, наскільки поганим був код. Objective-C надто складний порівняно з тим, що робить C #. Я був розпещений C #, і тепер я ціную всю важку роботу, яку вклала Microsoft. Просто читання Objective-C з викликами методів важко прочитати. C # в цьому елегантний. Це лише моя думка, я сподівався, що мова розробки Apple була такою ж, як і продукти Apple, але дорога мені, у Microsoft є чому повчитися. Немає сумнівів у програмі C # .NET. Я можу запустити програму і запускати її в рази швидше, ніж XCode Objective-C. Apple, звичайно, повинна взяти тут аркуш книги Microsoft, і тоді у нас буде ідеальне середовище. :-)


47
Незважаючи на те, що ви заглянули до книги розробників iPhone, ви все одно можете швидше створювати додаток на платформі, на якій ви маєте 20-річний досвід роботи? AMAZING
Kubi

25
У мене точно такий же досвід, як у Ваза. Я також набагато вдячніший за роботу, яку Microsoft вклала в C # та засоби розробки, такі як Visual Studio, після того, як я почав вивчати ціль C.
Рене,

4
Це був мій досвід, а також під час вивчення цілі-с, надмірна складність порівняно з с #. @ alexy13 Яку частину c та c ++ з оригінального повідомлення ви пропустили? Наявність десятиліття досвіду роботи в одній родині мов допомагає БАГАТУ оцінити, наскільки важко виконувати ту саму роботу з іншою мовою з тієї ж родини.
Андерсон Форталеза,

5
як це найкраща відповідь? це не стисла відповідь, просто явно упереджена думка про якусь мову, яку він вивчив за одну ніч, порівняно з мовою, якою він користується більше 20 років ... очевидно, ви не будете так добре володіти новою мовою
Heavy_Bullets

3
"Just reading Objective-C with method invokes is difficult to read"- ось лише один дуже суб’єктивний аргумент, який тут згадується як мінуси Obj-C. Все інше - це лише спірна риторика.
skywinder

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)

Завдання-C

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

Це виглядає жахливо. Я навіть спробував прочитати 2 книги на ньому, вони рано мене загубили, і зазвичай я не розумію цього з програмуванням книг / мов.

Я радий, що у нас є Mono для Mac OS, бо якби мені довелося покластися на Apple, щоб дати мені хороше середовище для розробки ...


17
Ігноруючи той факт, що 1-й рядок повинен закінчуватися [NSMutableArray array]натомість (він втрачає пам’ять), а 4-й рядок повинен починатися з NSString* xабо id x(помилка компіляції) ... Так, Objective-C не має загальних засобів (я, чесно кажучи, не пропускаю їх), ви не розумієте не індексує об’єкти із синтаксисом масиву, а API, як правило, більш детальні. То-май-то, то-мах-то. Це справді зводиться до того, що ви віддаєте перевагу бачити. (Ви можете написати той самий код на C ++ STL, і я б подумав, що це було жахливо.) Для мене читаючий код часто означає, що текст коду говорить вам, що він робить, і тому код Objective-C є кращим.
Quinn Taylor 02

18
Я насправді не знаходжу нічого поганого в синтаксисі як такому - головна причина, через яку він почувається менш читабельним, полягає в тому, що 1) він не знайомий всім, хто походить з фону C, і 2) він використовується в середині простих конструкцій C, де він виглядає чужим. З іншого боку, Smalltalkish named-parameters-as-part-of-method-name фактично робить виклики більш зрозумілими з самого початку. Насправді, ваш зразок коду C # це добре демонструє - він не компілюється, оскільки List<T>.Removeприймає рядок як аргумент і видаляє перше виникнення цього рядка. Щоб видалити за індексом, вам потрібно RemoveAt.
Павло Мінаєв 02

12
... тоді як версія ObjC з removeObjectAtIndex:, хоча і більш багатослівна, також однозначна щодо того, що вона робить.
Павло Мінаєв 02

6
Відмінні бали, Павло. Крім того, невідповідність між strings[0]і strings.RemoveAt(0)применшує ясність, принаймні для мене. (Крім того, мене завжди зловживає, коли назви методів починаються з великої літери ... Я знаю, що це незначне хитання, але це просто дивно.)
Квін Тейлор

4
У моєму випадку, як і для багатьох людей, читабельність "інструменту" впливає на мою продуктивність. Мені комфортно і продуктивно з багатьма мовами Objective-C, однак, ніколи не був однією з них, і це не через відсутність спроб. Але знову ж таки, зрештою, все стосується особистих переваг. На відміну від 20 років тому, вас не змушують використовувати мову X для націлювання на платформу Y. Ви обираєте те, що вам найбільше підходить.
TimothyP

17

Ручне управління пам’яттю - це те, з чим у початківців у Objective-C найбільше проблем, здебільшого тому, що вони вважають, що воно складніше, ніж є.

Objective-C та Cocoa поширюються на домовленості щодо забезпечення; знати і дотримуватися дуже невеликий набір правил, і ви отримаєте багато безкоштовно завдяки динамічному часу виконання у відповідь.

Не 100% істинним правилом, але достатньо хорошим для повсякденності є:

  • Кожен виклик до allocмає відповідати значенню a releaseв кінці поточної області дії.
  • Якщо повернене значення для вашого методу було отримано до allocцього часу, воно повинно бути повернуто до, return [value autorelease];а не збігатися з release.
  • Використовуйте властивості, і немає правила три.

Далі йде довше пояснення.

Управління пам’яттю базується на володінні; тільки власник екземпляра об'єкта повинен коли-небудь звільняти об'єкт, а всі інші завжди нічого не повинні робити. Це означає, що в 95% всього коду ви ставитесь до Objective-C так, ніби це зібране сміття.

То як щодо інших 5%? У вас є три методи, на які слід звернути увагу, будь-який екземпляр об’єкта, отриманий від цього методу, належить поточній області застосування методу :

  • alloc
  • Будь-який метод, що починається зі слова new , наприклад newабо newService.
  • Будь-який метод, що містить слово копія, такий як copyі mutableCopy.

Метод має три можливі варіанти щодо того, що робити з екземплярами об’єкта, що йому належить, до його виходу:

  • Звільніть його, releaseякщо це більше не потрібно.
  • Надайте право власності на поле (змінну екземпляра) або глобальну змінну, просто призначивши його.
  • Позбавтесь права власності, але дайте шанс комусь іншому отримати право власності до того, як екземпляр зникне, зателефонувавши autorelease.

Тож коли слід активно брати участь у власності, телефонуючи retain? Два випадки:

  • При призначенні полів у ваших ініціалізаторах.
  • При ручному впровадженні методу сетера.

2
+1 Відмінне резюме. Звучить дуже схоже на те, коли я навчився C років тому.
Alex Angas,

4
Тільки для уточнення, збір сміття повністю підтримується для Objective-C на Mac, і не потрібно робити будь-яке управління пам’яттю вручну. Керування пам'яттю вручну потрібно лише в iOS.
PlagueHammer

3
Тим не менше, добре навчитися основам управління пам’яттю, хоча б лише для підвищення продуктивності, коли вона вам потрібна (не потрібно запускати збір сміття).
FeifanZ

3
iOS 5 представив ARC, усунувши необхідність вручну звільняти виділений об'єкт. Але це все ще ніде так просто, як C #. Ви повинні пам’ятати, що Objective-C перевищує 20 років, і він дотримувався деяких вимог мов у ті часи: це знання, коли розподіляти, а коли звільняти / звільняти пам’ять. C # видалив все це для вас. Сказавши це, Cocoa має безліч API, які ще не будуть доступними в Windows Phone. Такі як жести, набагато більше контролю, коли справа стосується подій інтерфейсу користувача тощо ...
jyavenard

10

Звичайно, якщо все, що ви бачили у своєму житті, є ціллю C, то її синтаксис виглядає єдино можливим. Ми можемо назвати вас "незайманою програмісткою".

Але оскільки багато коду написано на C, C ++, Java, JavaScript, Pascal та інших мовах, ви побачите, що ObjectiveC відрізняється від усіх, але не в хорошому сенсі. Чи мали для цього причину? Давайте подивимось інші популярні мови:

С ++ додав багато додаткових можливостей до С, але він змінив початковий синтаксис лише настільки, наскільки це було потрібно.

C # додав багато додаткових функцій порівняно з C ++, але змінив лише те, що було потворно в C ++ (наприклад, видалення "::" з інтерфейсу).

Java багато що змінила, але вона зберегла звичний синтаксис, за винятком частин, де потрібні зміни.

JavaScript - це повністю динамічна мова, яка може робити багато речей, які ObjectiveC не може. І все-таки його творці не винайшли нового способу виклику методів та передачі параметрів лише для того, щоб відрізнятися від решти світу.

Visual Basic може передавати параметри не в порядку, як і ObjectiveC. Ви можете назвати параметри, але також можете передавати їх звичайним способом. Що б ви не використовували, це звичайний спосіб, відокремлений комами, який всі розуміють. Кома - це звичайний роздільник не лише в мовах програмування, але й у книгах, газетах та письмовій мові загалом.

Об’єкт Pascal має інший синтаксис, ніж C, але його синтаксис насправді легше читати програмісту (можливо, не комп’ютеру, але кому цікаво, що комп’ютер думає). Тож, можливо, вони відступили, але принаймні їх результат кращий.

Python має інший синтаксис, який навіть легше читати (для людей), ніж Pascal. Тож коли вони змінили це, зробивши його іншим, принаймні вони зробили це кращим для нас, програмістів.

І тоді ми маємо ObjectiveC. Додано деякі вдосконалення в C, але винайдено власний синтаксис інтерфейсу, виклик методу, передачу параметрів і ще ні. Цікаво, чому вони не поміняли місцями + і - так що плюс віднімає два числа. Це було б ще крутіше.

Стів Джобс зіпсувався, підтримавши ObjectiveC. Звичайно, він не може підтримати C #, що краще, але належить його найгіршому конкуренту. Тож це політичне рішення, а не практичне. Технологія завжди страждає, коли технічні рішення приймаються з політичних причин. Йому слід керувати компанією, що йому вдається, і залишити питання програмування справжнім експертам.

Я впевнений, що додатків для iPhone було б ще більше, якби він вирішив писати iOS і підтримувати бібліотеки будь-якою іншою мовою, крім ObjectiveC. Для всіх, крім завзятих шанувальників, незайманих програмістів та Стіва Джобса, ObjectiveC виглядає смішно, потворно і відразливо.


3
останні 2 абзаци підсумовують все
Закос

О так, звичайно, синтаксис виглядає смішно, але суть мови Objective-C полягає в тому, що в ньому є чи не найпростіший у використанні відображення всіх мов, і деякі справді блискучі функції виконання, що робить кілька парадигм майже тривіальними для реалізації. Наприклад, під час використання Objective-C мені ніколи не потрібно замислюватися над тим, яку лінійну таблицю використовувати - зв’язаний список чи вектор або що завгодно - просто, NSArrayі він обробляє вибір найкращого алгоритму на основі машини та природи даних.
Макстон Чан,

Я вступив на свою першу роботу програмістом (незайманим), що впроваджує інтерфейси користувача iOS-App в Objective-C. Наразі я хочу (через 3 роки) покинути цей самотній „острів” і навчитися чомусь більш незалежному від платформи і, отже, більш знаменному. Крім того, щоб дізнатись, чи інші фреймворки також оновлюються так швидко - і помилка. Гей! Нова функція! - Аварія ... Сподіваюся, що (німецький) центр вакансій витрачає на мене гроші на підручники з Java та / або C ++ / C #, оскільки я більше не хочу розробляти для Apple sh * t.
anneblue

5

Одне, що мені подобається вцілі-c, це те, що система об'єктів базується на повідомленнях, це дозволяє робити дійсно приємні речі, яких ти не міг зробити в C # (принаймні, поки вони не підтримують динамічне ключове слово!).

Ще одна чудова річ щодо написання програм для какао - це Interface Builder, це набагато приємніше, ніж дизайнер форм у Visual Studio.

Що стосується obj-c, що мене дратує (як розробника C #), це той факт, що ви повинні керувати власною пам’яттю (є збір сміття, але це не працює на iPhone) і що це може бути дуже багатослівно через синтаксис селектора та всі [].


2
dynamicдопоможе вам лише на півдорозі - реалізація справжнього динамічного об'єкта, навіть з такими тривіальними речами, як делегування повідомлень, є нудною навіть у C # 4.0. З іншого боку, ціна за гнучкість справжнього динамічного повідомлення, що передає а-ля ObjC, втрачає безпеку типу.
Павло Мінаєв 02

3
Варто зазначити, що Objective-C дозволяє статичну друк, що забезпечує набагато більший ступінь безпеки типу. Хтось віддає перевагу перевірці часу компіляції, інші віддають перевагу виконанню. Приємно (в обох мовах) те, що вибір не повинен бути абсолютним.
Quinn Taylor 02

3
Дизайнер Windows Forms не настільки чудовий, але якщо ви можете використовувати WPF (станом на .NET 3.0), суміш виразів важко перемогти ...
Nate,

Ви можете зробити багато цього в System.Reflectionпоєднанні з розширеннями в C # 3.0, ви можете викликати будь-який метод, який ви знайдете, але це не справжнє передавання повідомлень, це буде виглядати як obj.PassMessage("function_name", params object[] args);для кращого передавання повідомлень, інтегрованого в мову, метод, який не можна викликати на звичайному об'єкті потрібні.
Філіп Кунц

4

Як програміст, який тільки починає роботу з Objective-C для iPhone, виходячи з версії C # 4.0, мені не вистачає лямбда-виразів, зокрема Linq-to-XML. Ламбда-вирази є специфічними для C #, тоді як Linq-to-XML насправді є більш контрастним .NET проти какао. У прикладі програми, яку я писав, у мене був рядок 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, або просто з’ясувати, чи повернуті якісь елементи ... БАМ, все там же в тому ж рядку коду.

Є багато класів з відкритим кодом, які значно полегшують цю обробку в Objective-C, тому це робить більшу частину важкої роботи. Це просто не це вбудоване.

* ПРИМІТКА: Я насправді не компілював наведений вище код, він просто призначений як приклад, щоб проілюструвати відносну відсутність багатослівності, необхідної для C #.


Однак важливо не тут, щоб у цьому порівнянні не було стільки "відсутності багатослів'я" з боку C #, а лише те, що деталізація міститься у фреймворкових класах .net, які ви використовуєте для синтаксичного аналізу вашого XML. Якщо ви вивчите код всередині них, ви, швидше за все, знайдете набагато більше коду C #, можливо, навіть більш детальний.
XIVSolutions

3

Ймовірно, найголовніша відмінність - це управління пам’яттю. З C # ви отримуєте збір сміття, оскільки це мова, заснована на CLR. За допомогою Objective-C вам потрібно управляти пам’яттю самостійно.

Якщо ви походите з фону C # (або будь-якої іншої сучасної мови), перехід на мову без автоматичного управління пам’яттю буде дійсно болючим, оскільки ви витратите багато свого часу на кодування на належне управління пам’яттю (і налагодження як Ну).


6
ObjC відстежує вивезення сміття в ці дні. З іншого боку, C # дозволяє самостійно управляти пам'яттю, якщо хочете (завдяки необробленим покажчикам).
Павло Мінаєв 02

3
Я не вважаю ручне керування пам'яттю в Objective-C (в контексті фреймворків Apple) великим тягарем: цикл збереження / випуску / автоматичного випуску набагато менш громіздкий, ніж "традиційне" управління пам'яттю в C і C ++.
mipadi 02

5
Це просто неправда DSO - навіть у середовищі, де не збирається сміття, як iPhone, на збереження / випуск та автоматичний випуск потрібно близько 10 хвилин, а потім це не проблема. Я знайшов багато C # -рів, які люблять перебільшувати завдання управління пам'яттю. Вони майже схожі на те, що вони бояться, що їм інакше занадто сподобається obj-c ...;)
h4xxr 02

4
Основи ручного управління пам’яттю не є складними. Але це може дуже швидко ускладнитися, коли ви починаєте передавати виділені об'єкти навколо і вам потрібно мати справу зі складними графіками об'єктів, оскільки вам потрібно ретельно дотримуватися правил, хто і коли відповідає за звільнення. Реалізації підрахунку посилань роблять це дещо простішим, за винятком того, що вам потрібно мати справу з циклами в графіках об'єктів ... порівняно з C #, все це IMO - велика різниця.
DSO 02

1

Ось досить гарна стаття, що порівнює дві мови: http://www.coderetard.com/2008/03/16/c-vs-objective-c/


Шкода, що сторінка стверджує, що знаходиться в UTF-8, але має всілякі неприємні заміни апострофам і лапкам. Я думаю, що в його тексті використовуються "пишні" цитати, але вони, звичайно, спотворюють код ...
Квін Тейлор

вони, схоже, вкрали їхню вступну свиню, але навіть у вихідній статті код змінено. не є особливо чудовою статтею.
dnord 02

-2

Окрім різниці в парадигмі між двома мовами, різниці не дуже багато. Як би мені не хотілося це говорити, ви можете робити такі самі речі (мабуть, не так просто) з .NET та C #, як і з Objective-C та Cocoa. Починаючи з Leopard, Objective-C 2.0 має збирання сміття, тому вам не доведеться самостійно керувати пам’яттю, якщо ви цього не хочете (сумісність коду зі старими програмами Mac і iPhone - це дві причини для цього).

Що стосується структурованого, читабельного коду, велика частина тягаря лежить на програмісті, як і на будь-якій іншій мові. Однак я вважаю, що парадигма передачі повідомлень добре піддається читаному коду за умови, що ви належним чином називаєте свої функції / методи (знову ж таки, як і будь-яка інша мова).

Я першим визнаю, що я не дуже знайомий з C # або .NET. Але перелічені вище причини Квін - це чимало причин, через які я не хочу стати такою.


-3

Виклики методів, що використовуються в obj-c, роблять для легко читаного коду, на мій погляд, набагато витонченіший, ніж c #, а obj-c побудований поверх c, тому весь код c повинен працювати нормально в obj-c. Однак для мене великим продавцем є те, що obj-c - це відкритий стандарт, тому ви можете знайти компілятори для будь-якої системи.


2
ISO C # також є відкритим стандартом. Крім того, наскільки мені відомо, єдиним існуючим компілятором ObjC є gcc.
Павло Мінаєв 02

@Pavel: Є також Портативний компілятор об’єктів ( users.telenet.be/stes/compiler.html ) і clang.
mipadi 02

1
Насправді GCC більше не є єдиним компілятором - Clang і LLVM - це пара технологій, розроблених і розроблених для заміни GCC і виконання речей, які вона ніколи не могла, включаючи компіляцію JIT. Це в основі OpenCL в Snow Leopard. Вони також розширюються до інших мов, і їх варто перевірити.
Quinn Taylor 02

2
Я, чесно кажучи, не вважав би портативність плюсом Objective-C. Швидше за все, сильні сторони полягають у швидкому розвитку та зменшенні обсягу коду для виконання того самого завдання.
Quinn Taylor 02

Дякуємо за виправлення моєї помилки щодо доступності компілятора. Ну, портативність у будь-якому випадку технічно є - наприклад, я можу використовувати MinGW / ObjC на Win32 дуже добре, - в цьому сенсі вона така ж портативна, як і сама gcc. Звичайно, бібліотек там не буде (хоча ... чи існує GnuStep / Win32?), Але ця ситуація насправді не набагато гірша, ніж у нас з Mono; тому в цілому я б сказав, що портативність не є сильним моментом жодної сторони.
Павло Мінаєв 02
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.