Как 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 не идеален, но, безусловно, имеет множество мощных и полезных функций. Пренебрегая чем-либо как «чистым злом», не подкрепляя его и не предоставляя какого-либо контекста для сравнения, это FUD, который никому не помогает. В любом случае это не имеет отношения к вопросу.
Куинн Тейлор,
11
Xcode 3.2, возможно, лучшая IDE, которую я когда-либо использовал, с ее элегантной обработкой точек останова, статическим анализом, встроенными сообщениями об ошибках и множеством других функций. Кстати, это «Xcode», а не «XCode». @Nathan, я действительно не понимаю, почему вам нужно очернять Xcode, назвав его «чистым злом» - без всякого оправдания - в обсуждении языков.
PlagueHammer 02
6
Одна важная вещь, которую вы получите, используя Objective-C, - это то, что у вас будет доступ к фреймворкам Какао. Кроме того, C, C #, Java и C ++ имеют общее синтаксическое наследие. Objective-C получил свой синтаксис от Smalltalk.
Амок,
4
Вы работаете на C # с помощью VMWare fusion? Просто используйте mono и monodevelop (это версия .NET и Visual Studio с открытым исходным кодом, которая работает на Mac и Linux. Используя Mono, вы также можете создавать приложения для Mac и iPhone, используя C #, а также использовать библиотеку .NET, а также Cocoa. ...
Робин Хеггелунд Хансен
5
@ user668039 15 лет опыта использования C #? Он был выпущен в 2001 году!
Ian Newson

Ответы:

89

Ни один язык не подходит для всех задач, и Objective-C не исключение, но есть некоторые очень специфические тонкости. Как и использование LINQи var(для которого я не знаю прямой замены), некоторые из них строго связаны с языком, а другие - с фреймворком.

( ПРИМЕЧАНИЕ: так же, как C # тесно связан с .NET, Objective-C тесно связан с Cocoa. Следовательно, некоторые из моих соображений могут показаться не связанными с Objective-C, но Objective-C без Cocoa сродни C # без .NET / WPF / LINQ, работающий под Mono и т. Д. Это просто не так, как обычно.)

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

  • Одна из лучших частей Objective-C - это динамический характер: вместо вызова методов вы отправляете сообщения, которые среда выполнения динамически направляет. В сочетании (разумно) с динамической типизацией это может упростить или даже тривиально реализовать множество мощных шаблонов.

  • Как строгий надмножество C, Objective-C полагается, что вы знаете, что делаете. В отличие от управляемого и / или типизированного подхода таких языков, как C # и Java, Objective-C позволяет вам делать то, что вы хотите, и испытывать последствия. Очевидно, что временами это может быть опасно, но тот факт, что язык активно не мешает вам делать большинство вещей, довольно мощный. ( РЕДАКТИРОВАТЬ: я должен уточнить, что C # также имеет «небезопасные» функции и возможности, но их поведение по умолчанию - это управляемый код, от которого вы должны явно отказаться. Для сравнения, Java допускает только типизированный код и никогда не предоставляет необработанные указатели в так, как это делают C и другие.)

  • Категории (добавление / изменение методов в классе без создания подклассов или без доступа к исходному тексту) - это отличный палка о двух концах. Это может значительно упростить иерархию наследования и исключить код, но если вы сделаете что-то странное, результаты иногда могут быть непонятными.

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

  • Связывание какао и наблюдение за ключом могут устранить тонны связующего кода, и фреймворки какао широко это используют. Динамическая отправка Objective-C работает рука об руку с этим, поэтому тип объекта не имеет значения, если он соответствует ключу-значению.

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

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

Куинн Тейлор
источник
7
Технически, C # имеет все без типобезопасный силу особенности , что делает ObjC: сырые указатели, указатель арифметика, связанно-непроверенные массивы, союзы, alloca. Это просто не делает их доступными - вам нужно явно указать.
Павел Минаев
8
Я просто упоминаю Cocoa, потому что большая часть привлекательности программирования на Objective-C связана с фреймворками Cocoa. Был бы C # интересен без .NET и / или WPF? Спрашивающий специально упомянул LINQ, поэтому он явно смотрит не только на язык, но и на опыт.
Куинн Тейлор,
7
Что нормально. Я не пытаюсь драться с C #. Если бы мне пришлось писать программное обеспечение для Windows, я бы использовал это. Я просто пытаюсь указать на сходства и различия между языками и соответствующими инструментами. Очевидно, вы более опытны в C #, а я - в Objective-C. Я ценю ваши разъяснения, но, возможно, наиболее полезными будут более конструктивные ответы и меньшее количество секущихся волос.
Куинн Тейлор,
11
Это не секущиеся волосы, Куинн. Я просто отметил, что то, что началось как сравнение языков, в какой-то момент в вашем ответе превратилось в общее обсуждение того, насколько хорош Какао. Я все же хотел бы отметить, что ваши баллы по Cocoa не являются сравнениями - они говорят, что «он делает X хорошо» - и это вполне может быть так - но они не говорят «он делает X лучше / хуже, чем C # +. WPF ", о чем и идет речь.
Павел Минаев
6
+1 отличный ответ Quinn
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, и тогда у нас будет идеальная среда. :-)

Waz
источник
47
Даже несмотря на то, что вы взглянули на книгу разработчиков для iPhone, вы все равно можете быстрее создавать приложения на платформе, на которой у вас есть 20-летний опыт работы? УДИВИТЕЛЬНЫЙ
Куби
25
У меня точно такой же опыт, как и у Waz. Я также гораздо более благодарен Microsoft за работу, которую Microsoft вложила в C # и инструменты разработки, такие как Visual Studio, после того, как я начал изучать Objective C.
Рене
4
Это был мой опыт при изучении Objective-C, сверхсложность по сравнению с C #. @ alexy13 Какую часть c и c ++ из исходного сообщения вы пропустили? Многолетний опыт владения одной семьей языков помогает МНОГОЧИСЛЕННОМУ оценить, насколько сложно выполнять ту же работу с другим языком из той же семьи.
Anderson Fortaleza
5
как этот главный ответ? это не краткий ответ, просто явно предвзятое мнение о каком-то языке, который он выучил за ночь, и о языке, который он использовал более 20 лет ... очевидно, что вы не будете так хорошо владеть новым языком
Heavy_Bullets
3
"Just reading Objective-C with method invokes is difficult to read"- вот только один очень субъективный аргумент, который упоминается здесь как минусы Obj-C. Все остальное - спорная риторика.
Skywinder 05
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];

Выглядит ужасно. Я даже пробовал читать по нему две книги, они потеряли меня рано, и обычно я не получаю этого с книгами / языками по программированию.

Я рад, что у нас есть Mono для Mac OS, потому что если бы мне пришлось положиться на Apple, чтобы дать мне хорошую среду разработки ...

TimothyP
источник
17
Игнорируя тот факт, что 1-я строка должна заканчиваться [NSMutableArray array]вместо этого (утечка памяти), а 4-я строка должна начинаться с NSString* xили id x(ошибка компиляции) ... Да, в Objective-C не хватает дженериков (я, честно говоря, их не скучаю), вы не делаете Объекты не индексируются с синтаксисом массива, а API обычно более подробны. To-may-to, to-mah-to. Все сводится к тому, что вы предпочитаете видеть. (Вы могли бы написать тот же код на C ++ STL, и я бы подумал, что это ужасно.) Для меня читаемый код часто означает, что текст кода говорит вам, что он делает, и поэтому код Objective-C предпочтительнее.
Куинн Тейлор,
18
Я действительно не нахожу ничего плохого в синтаксисе как таковом - основная причина, по которой он кажется менее читаемым, заключается в том, что 1) он незнаком для всех, кто приходит из фона C, и 2) он используется в середине простых конструкций C, где он выглядит чужим. С другой стороны, Smalltalkish именованные параметры как часть имени метода фактически с самого начала делают вызовы более понятными. Фактически, ваш пример кода C # хорошо демонстрирует это - он не будет компилироваться, потому что List<T>.Removeпринимает строку в качестве аргумента и удаляет первое появление этой строки. Чтобы удалить по индексу, вам понадобится RemoveAt.
Павел Минаев
12
... тогда как версия ObjC с removeObjectAtIndex:, хотя и более подробна, также недвусмысленно говорит о том, что она делает.
Павел Минаев
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, например copyи mutableCopy.

У метода есть три возможных варианта того, что делать с экземплярами принадлежащих ему объектов перед выходом:

  • Освободите его с помощью, releaseесли он больше не нужен.
  • Передайте владение полем a (переменной экземпляра) или глобальной переменной, просто назначив ее.
  • Откажитесь от владения, но дайте кому-то другому возможность стать владельцем до того, как экземпляр уйдет, позвонив 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

Конечно, если все, что вы видели в своей жизни, - это Objective C, то его синтаксис выглядит единственно возможным. Мы могли бы назвать вас «девственницей программирования».

Но поскольку много кода написано на C, C ++, Java, JavaScript, Pascal и других языках, вы увидите, что ObjectiveC отличается от всех них, но не в хорошем смысле. Была ли у них на это причина? Посмотрим на другие популярные языки:

C ++ добавил к C много дополнений, но изменил исходный синтаксис лишь настолько, насколько это было необходимо.

C # добавил много дополнительных функций по сравнению с C ++, но изменил только то, что было некрасиво в C ++ (например, удаление символа "::" из интерфейса).

Java изменила много вещей, но сохранила знакомый синтаксис, за исключением тех частей, где это изменение было необходимо.

JavaScript - это полностью динамический язык, который может делать многое, чего не может ObjectiveC. Тем не менее, его создатели не изобрели новый способ вызова методов и передачи параметров только для того, чтобы отличаться от остального мира.

Visual Basic может передавать параметры не по порядку, как и ObjectiveC. Вы можете назвать параметры, но вы также можете передать их обычным способом. Что бы вы ни использовали, это обычный способ, разделенный запятыми, который все понимают. Запятая является обычным разделителем не только в языках программирования, но и в книгах, газетах и ​​письменной речи в целом.

Object Pascal имеет синтаксис, отличный от C, но его синтаксис на самом деле ЛЕГЧЕ читать для программиста (возможно, не для компьютера, но кого волнует, что думает компьютер). Так что, возможно, они отклонились, но, по крайней мере, их результат лучше.

У Python другой синтаксис, который даже легче читать (для людей), чем Паскаль. Поэтому, когда они изменили его, сделали его другим, по крайней мере, они сделали его лучше для нас, программистов.

И затем у нас есть ObjectiveC. Добавлены некоторые улучшения в C, но изобретен собственный синтаксис интерфейса, вызов методов, передача параметров и многое другое. Интересно, почему они не поменяли местами + и -, так что плюс вычитает два числа. Было бы еще круче.

Стив Джобс облажался, поддержав ObjectiveC. Конечно, он не может поддерживать C #, что лучше, но принадлежит его худшему конкуренту. Так что это политическое решение, а не практическое. Технологии всегда страдают, когда технические решения принимаются по политическим причинам. Он должен возглавить компанию, что у него хорошо получается, а вопросы программирования оставить настоящим экспертам.

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

user561168
источник
3
последние 2 абзаца суммируют все
Закос
Да, конечно, синтаксис выглядит нелепо, но жемчужина языка Objective-C состоит в том, что он имеет почти самое простое в использовании отражение из всех языков и некоторые действительно блестящие функции времени выполнения, которые делают несколько парадигм почти тривиальными для реализации. Например, при использовании Objective-C мне никогда не нужно думать, какую линейную таблицу использовать - связанный список, вектор или что-то еще - просто NSArrayи он обрабатывает выбор лучшего алгоритма на основе машины и характера данных.
Макстон Чан
Я поступил на свою первую работу в качестве (девственного) программиста, реализующего пользовательские интерфейсы iOS-App на Objective-C. Все, что я хочу сейчас (через 3 года), - это покинуть этот одинокий «остров» и узнать что-то более независимое от платформы и, следовательно, более основательное. Также, чтобы узнать, обновляются ли другие фреймворки так быстро - и содержат ли ошибки. Привет! Новая особенность! - Авария ... Надеюсь, (немецкий) центр занятости потратит для меня немного денег на учебные пособия по Java и / или C ++ / C #, поскольку я больше не хочу разрабатывать для Apple дерьмо.
anneblue
5

Что мне нравится в objective-c, так это то, что объектная система основана на сообщениях, она позволяет делать действительно хорошие вещи, которые вы не могли бы сделать в C # (по крайней мере, пока они не поддерживают ключевое слово dynamic!).

Еще одна замечательная вещь в написании приложений какао - это Interface Builder, он намного лучше, чем конструктор форм в Visual Studio.

Что меня раздражает (как разработчика C #) в obj-c, так это то, что вам нужно управлять собственной памятью (есть сборка мусора, но это не работает на iPhone) и что она может быть очень многословной из-за синтаксис селектора и все [].

Джонни
источник
2
dynamicэто поможет вам только на полпути - реализация настоящего динамического объекта, даже с такими тривиальными вещами, как делегирование сообщений, утомительна даже в C # 4.0. С другой стороны, ценой гибкости, истинной динамической передачи сообщений а-ля ObjC, является потеря безопасности типов.
Павел Минаев
3
Стоит отметить, что Objective-C позволяет использовать статическую типизацию, что обеспечивает гораздо большую степень безопасности типов. Некоторые люди предпочитают проверку во время компиляции, другие предпочитают проверку во время выполнения. Приятно (на обоих языках) то, что выбор не обязательно должен быть абсолютным.
Куинн Тейлор,
3
Дизайнер Windows Forms не так хорош, но если вы умеете использовать WPF (начиная с .NET 3.0), Expression Blend трудно превзойти ...
Нейт
Вы можете сделать многое из этого в 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 и 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, или просто узнать, были ли возвращены какие-либо элементы ... БАМ, все в той же строчке кода.

Есть много классов с открытым исходным кодом, которые значительно упрощают эту обработку в Objective-C, так что большая часть тяжелой работы ложится на него. Это просто не встроено.

* ПРИМЕЧАНИЕ: на самом деле я не компилировал приведенный выше код, он просто предназначен для примера, чтобы проиллюстрировать относительную недостаточную многословность, требуемую C #.

Brentlightsey
источник
Однако здесь важно не отметить, что в этом сравнении C # не столько «недостаток многословности», сколько то, что многословность содержится в классах инфраструктуры .net, которые вы используете для синтаксического анализа XML. Если вы изучите код внутри них, вы, вероятно, найдете намного больше кода C #, возможно, даже более подробного.
XIVSolutions
3

Наверное, самое важное отличие - это управление памятью. С C # вы получаете сборку мусора, поскольку он является языком на основе CLR. С Objective-C вам нужно самостоятельно управлять памятью.

Если вы работаете с C # (или с любого современного языка, если на то пошло), переход на язык без автоматического управления памятью будет действительно болезненным, поскольку вы потратите много времени на кодирование на правильное управление памятью (и отладку как Что ж).

DSO
источник
6
В настоящее время ObjC отслеживает сборку мусора. С другой стороны, C # позволяет при желании управлять памятью самостоятельно (благодаря необработанным указателям).
Павел Минаев
3
Я не считаю, что ручное управление памятью в Objective-C (в контексте фреймворков Apple) является большим бременем: цикл сохранения / выпуска / автоматического выпуска намного менее громоздок, чем «традиционное» управление памятью в C и C ++.
mipadi 02
5
Это просто не настоящий DSO - даже в среде, не связанной со сборкой мусора, такой как iPhone, изучение функций сохранения / выпуска и автоматического выпуска занимает около 10 минут, и тогда это не проблема. Я нашел много специалистов по C #, которые любят преувеличивать проблемы управления памятью. Это почти похоже на то, что они боятся, что в противном случае им
станет
4
Основы ручного управления памятью несложны. Но это может очень быстро усложниться, когда вы начнете передавать выделенные объекты и будете иметь дело со сложными графами объектов, потому что вам нужно тщательно следовать правилам того, кто отвечает за освобождение и когда. Реализации подсчета ссылок делают это несколько проще, за исключением того, что вам нужно иметь дело с циклами в графах объектов ... по сравнению с C #, все это IMO - большая разница.
DSO
1

Вот довольно хорошая статья, в которой сравниваются два языка: http://www.coderetard.com/2008/03/16/c-vs-objective-c/

Cinder6
источник
Жаль, что страница утверждает, что написана в UTF-8, но содержит множество неприятных замен для апострофов и кавычек. Я думаю, что в его тексте используются "соблазнительные" цитаты, но они наверняка искажают код ...
Куинн Тейлор
они, кажется, украли свое вступление целиком, но даже в исходной статье их код изменен. и это не особенно хорошая статья.
dnord 02
-2

Кроме разницы в парадигме между двумя языками, большой разницы нет. Как бы мне не хотелось это говорить, вы можете делать те же вещи (вероятно, не так легко) с .NET и C #, как с Objective-C и Какао. Что касается 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.
Павел Минаев
@Pavel: Также есть компилятор переносимых объектов ( users.telenet.be/stes/compiler.html ) и clang.
mipadi 02
1
На самом деле, GCC больше не единственный компилятор - Clang и LLVM - это пара технологий, разработанных и разработанных для замены GCC и делающих то, чего он никогда не мог, включая JIT-компиляцию. Это лежит в основе OpenCL в Snow Leopard. Они также расширяются на другие языки, и их стоит попробовать.
Куинн Тейлор,
2
Честно говоря, я бы не стал считать переносимость преимуществом Objective-C. Скорее, сильные стороны заключаются в быстрой разработке и уменьшении объема кода для выполнения той же задачи.
Куинн Тейлор,
Спасибо, что исправили мою ошибку о доступности компилятора. Ну, технически переносимость в любом случае есть - например, я могу использовать MinGW / ObjC на Win32 просто отлично - в этом смысле он такой же переносимый, как и сам gcc. Конечно, библиотек там не будет (хотя ... есть ли GnuStep / Win32?), Но эта ситуация на самом деле не намного хуже, чем у нас с Mono; так что в целом я бы сказал, что портативность не является сильной стороной ни для одной из сторон.
Павел Минаев