Ответы:
Сначала я выучу C. Я выучил C (и многое сделал на C) перед тем, как перейти на Obj-C. У меня много коллег, которые никогда не были настоящими программистами на C, они начали с Obj-C и выучили C ровно столько, сколько необходимо.
Время от времени я вижу, как они решают проблему полностью в Obj-C, что иногда приводит к очень неуклюжим решениям. Обычно я затем заменяю некоторый код Obj-C чистым кодом C (в конце концов, вы можете смешивать их сколько угодно, содержание метода Obj-C может быть полностью чистым кодом C). Без какого-либо намерения оскорбить любого программиста Obj-C, есть решения, которые очень элегантны в Obj-C, это решения, которые просто работают (и выглядят) намного лучше благодаря объектам(ООП-программирование может сделать сложные программы намного красивее, чем функциональное программирование; полиморфизм, например, блестящая особенность) ... и мне очень нравится 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 или знаете только его основы и никогда не пробовали, насколько элегантно он может решить некоторые общие проблемы, вы фактически изучили только половину Obj-C. C является фундаментальной частью Obj-C. Возможность использовать C в любое время и везде является его фундаментальной особенностью.
Типичным примером был некоторый код, который мы использовали, который должен был кодировать данные в base64, но мы не могли использовать для этого внешнюю библиотеку (без OpenSSL lib). Мы использовали кодировщик base64, полностью написанный с использованием классов Какао. Он работал нормально, но когда мы заставили его кодировать 200 МБ двоичных данных, это заняло целую вечность, а накладные расходы на память были недопустимыми. Я заменил его крошечным ультракомпактным кодировщиком base64, полностью написанным как одна функция C (я скопировал тело функции в тело метода, метод принял NSData в качестве входных данных и вернул NSString в качестве выходных данных, однако внутри функции все было на языке C). Кодировщик C был намного компактнее, он превосходил кодировщик чистого Cocoa в 8 раз по скорости, а накладные расходы на память были намного меньше. Кодирование / декодирование данных, игра с битами и аналогичные задачи низкого уровня - это лишь сильные стороны C.
Другим примером был код пользовательского интерфейса, который рисовал много графиков. Для хранения данных, необходимых для рисования графиков, мы использовали NSArray. На самом деле NSMutableArray's, поскольку график был анимированным. Результат: очень медленная анимация графика. Мы заменили все NSArray на обычные массивы C, объекты со структурами (в конце концов, информация о координатах графа - это то, что вам нужно в объектах), доступ к перечислителю с простыми циклами for и начали перемещать данные между массивами с помощью memcopy вместо того, чтобы брать данные из одного массива в другой - index для index. Результат: Ускорение в 4 раза. График плавно анимировался даже на старых системах контекстной рекламы.
Слабость C в том, что каждая более сложная программа в конечном итоге становится уродливой. Обеспечение читабельности, расширяемости и управляемости приложений C требует от программиста большой дисциплины. Многие проекты терпят неудачу из-за отсутствия этой дисциплины. Obj-C упрощает структурирование приложения с использованием классов, наследования, протоколов и так далее. Тем не менее, я бы не стал использовать чистую функциональность C в рамках метода без необходимости. Я предпочитаю хранить весь код в приложении Objective-C в методе объекта; все остальное противоречит цели объектно-ориентированного приложения. Однако в рамках метода я иногда использую исключительно чистый C.
Вы можете достаточно легко изучить C и Objective-C одновременно - конечно, нет необходимости изучать детали C (включая арифметику указателей и т. Д.), Прежде чем начинать с дополнений Objective-C к языку, и как начинающий программист Быстрое освоение Objective-C может помочь вам быстрее начать «мыслить объектами».
Что касается доступных ресурсов, документация Apple обычно предполагает знакомство с C, поэтому использование языка программирования Objective-C 2.0 не принесет вам большой пользы. Я бы вложил деньги в копию книги «Программирование в Objective-C» Стивена Кочана (в зависимости от того, как быстро вы хотите начать, вы можете подумать о том, чтобы дождаться второго издания):
Библиотека разработчиков для программирования Objective-C Библиотека для разработчиков для Objective-C 2.0
Он не предполагает никакого предыдущего опыта и учит вас Objective-C и столько C, сколько вам нужно.
Если вы чувствуете себя немного амбициозным, вы можете начать с учебника Скотта Стивенсона "Learn C". , но для него есть некоторые предварительные условия («Вы уже должны знать хотя бы один язык сценариев или программирования, включая функции, переменные и циклы. Вы». Мне также нужно будет вводить команды в Терминале Mac OS X. ").
(Для протокола и для контекста: в 1991 году я изучил и то, и другое одновременно - похоже, это не причинило мне никакого вреда. Тем не менее, у меня был опыт работы с BASIC, Pascal, Logo и LISP. )
Я много думал об этом, прежде чем писать книгу по Objective-C. Во-первых, я действительно считаю, что изучение языка C перед изучением Objective-C - неправильный путь. C - процедурныйязык, содержащий множество функций, которые не нужны для программирования на Objective-C, особенно на уровне новичка. Фактически, использование некоторых из этих возможностей противоречит принципу соблюдения хорошей методологии объектно-ориентированного программирования. Также не рекомендуется изучать все детали процедурного языка (и атаковать решение проблемы с помощью функций и методов структурированного программирования) перед изучением объектно-ориентированного языка. Это может запустить программиста в неверном направлении, что потенциально может привести к развитию неправильной ориентации и мышления для развития хорошей дисциплины объектно-ориентированного программирования. Тот факт, что Objective-C является расширением языка C, не означает, что вам нужно сначала изучить C!
Я считаю, что обучение Objective-C и базового языка C как единого интегрированного языка - это правильный подход. Нет причин узнавать, что выражение «for» взято из языка C, а не из его надмножества языка Objective-C. Кроме того, зачем подробно изучать такие вещи, как массивы и строки C (и манипулировать ими) прежде чемузнать, например, о массиве (NSArray) и строковых объектах (NSString)? Во многих текстах на C много времени уделяется структурам и указателям на структуры, а также итерации по массивам с указателями. Но вы можете начать писать программы на Objective-C, даже не зная ни об одной из этих функций языка C. А для начинающего программиста это большое дело. Это не только сокращает кривую обучения, но также сокращает количество материала, который необходимо изучить (и частично отфильтровать) для написания программ Objective-C.
Я согласен с тем, что вы захотите изучить большую часть, если не все, базовые функции C, но многие из них можно отложить до твердого понимания определения классов и методов, работы с объектами и выражениями сообщений и понимания концепций наследования и полиморфизм хорошо изучен.
Я бы сразу погрузился в Objective C - если у вас уже есть несколько языков, кривая обучения - это не синтаксис, а Cocoa.
Я думаю, что по большей части изучение C - хорошая идея, независимо от того, на какую арену вы собираетесь, по крайней мере, чтобы получить представление о внутренней работе разработки программного обеспечения, прежде чем использовать предварительно упакованные товары, таким образом, если что-то пойдет не так у вас больше шансов понять внутреннюю работу. На SO есть много дискуссий по этому поводу, и это довольно субъективный вопрос, но в целом вы по своей сути будете использовать C в своем коде Objective-C, поэтому я думаю, что это действительно зависит от вас. Я человек опытный, но иногда это может мешать, и я знаю нескольких умных людей, которые работали сверху вниз, я думаю, что важная часть состоит в том, чтобы вы понимали внутреннюю работу, как это будет отделите свои возможности от тех, кто этого не делает, а также увеличьте свои возможности.
Перед изучением Objective-C, который является строгим надмножеством C, рекомендуется изучить C. Это означает, что Objective-C может поддерживать весь нормальный код C, поэтому код, общий для программ C, обязательно появится даже в Objective- Код C.
Помимо того, что вы посмотрите на вещи исключительно с точки зрения языка, вы обнаружите, что Mac OS X - это полноценная операционная система Unix. Все библиотеки системного уровня написаны на C.
Вероятно, можно изучить и то, и другое одновременно, но я думаю, что вы оцените и поймете Objective-C больше, если сначала у вас будет твердое рабочее знание C.
Я бы изучил Objective-C и выучил столько C, сколько вам нужно, по ходу дела.
Области C, от которых вы не будете сильно зависеть:
Изучая Objective-C и Какао, вы не можете избежать изучения частей C. Например, прямоугольники обычно представлены CGRect, структурой C.
Если у вас есть время, непременно выучите C. Как говорили здесь другие, книга Кочана (второе и первое издания) превосходна как книга, в которую можно погрузиться.
Есть много вещей, которые вы не можете сделать только в Objective-C, поэтому изучение некоторых базовых навыков C будет очень важным. По крайней мере, вам нужно понимать объявления переменных и основные функции библиотеки C, иначе вы будете разочарованы.
Честно говоря, так много языков основано на синтаксисе C, что полезно знать его. Я бы потратил неделю или две, чтобы ознакомиться с C, в любом случае.
Тем не менее, я только что обучил себя Objective C, и я должен быть честным: я не нашел свой опыт C таким полезным, как я мог подумать. Цель C определенно открыла мне глаза.
Вы можете сразу перейти к Objective-C со следующими преимуществами:
По крайней мере, мне легче выучить новый язык, когда меня интересует какое-то конкретное приложение или образец, и я терплю неудачу, когда мне приходится изучать что-то другое, что не совсем то, что меня интересует.
Вы всегда сможете уточнить свои знания C позже, если заинтересуетесь программированием более низкого уровня.
Лучше, не знаю, тем более, потому что я не знаком с Objective-C.
Но основы C не так сложно изучить, это не очень сложный язык (с точки зрения синтаксиса, а не с точки зрения освоения!), Так что дерзайте, это не будет потрачено зря.
Лично я считаю, что изучать C - это всегда хорошая идея, это дает хорошее представление о том, как работает компьютер. В конце концов, большинство языков и систем по-прежнему написаны на C. Тогда вперед! :-)
PS: Под «двигаться дальше» я не имел в виду «бросить», просто «узнать больше, узнать другое». Зная C, вы никогда не откажетесь от него: Java использует JNI для вызова подпрограмм C для низкоуровневых вещей, Python, Lua и т. Д. Часто расширяются с помощью кода C (ссылка Lua даже предполагает некоторые знания C для некоторых функций, которые просто тонкая оболочка для функции C позади) и так далее.
Да, изучение языка C перед любыми другими языками продвинутого уровня поможет вам быстро выучить другие языки.
C дает очень небольшую абстракцию от сборки. Некоторые компиляторы C даже позволяют встроенную сборку. Это может быть очень полезно для размышлений о том, как работает компьютер, что важно знать.
При этом, если вы действительно заинтересованы в Object-C, не позволяйте себе зацикливаться на написании чего-либо на C только потому, что это «хорошо для вас». Вам не нужно расстраиваться, когда вы пытаетесь освоить новый набор навыков. Важно, чтобы вы получали удовольствие от того, что делаете.
Вы хотите быть заядлым разработчиком? Тогда сначала выучите c.
Книги, которые вам нужны, чтобы полностью овладеть c, - одни из лучших произведений в области технологий. Вот что вам понадобится:
Цель C настолько отличается от C, что не заслуживает изучения C.
С точки зрения синтаксиса / языковой семьи почти лучше изучать SmallTalk (на котором основана цель C)
С практической точки зрения сосредоточьтесь на изучении одного языка за раз.
Позже, если вы захотите выучить другой язык, C ++, Java и Python 1) просты для изучения в совокупности 2) популярны и, следовательно, востребованы 3) мощны.
Перед запуском Objective_C вы должны иметь базовые знания C, но нет необходимости осваивать каждую деталь C.
Я опубликовал свои заметки после прочтения "Programming in Objective-C" на случай, если это поможет кому-то другому.
В зависимости от многих языков, которые вы уже знаете, может быть лучше просто начать изучать Objective-C. Основа в большинстве языков в основном одинакова, отличается синтаксис. Изучение C в первую очередь не имеет большого значения, когда дело доходит до изучения Objective-C.
Я сразу выучил Objective-C, и он работал нормально около года, мне просто было трудно читать код C, когда я загружал проект, чтобы посмотреть, как они работают, но теперь я действительно чувствую необходимость изучить C. ObjC без C, но рано или поздно вам понадобится C.
ИМХО нужно сначала изучить хоть немного C, особенно указатели. Это даже более важно, если кто-то исходит из языка, в котором нет указателей. Многие люди спрашивают о таком коде, как
NSString *string = [[NSString alloc] init];
string = @"something";
поскольку они не знают различия между указателем и объектом, на который он указывает.
Конечно, не обязательно изучать весь C, прежде чем можно будет начать с Objective-C, но некоторые фундаментальные вещи абсолютно необходимы.
Черт возьми, идите прямо к цели C!
Я перешел с ActionScript 3 на Objective C, и у меня уже есть стажер в компании!
Делай что хочешь.
Если вы выучили какой-то другой язык раньше, у вас всегда будет путаница при написании правильного синтаксиса. Я не знаю цели, но объект C использует странный (необычный) синтаксис для вызова методов объекта. Он называет это отправкой сообщений, да, это верно в соответствии с чистой объектно-ориентированной концепцией, однако большинство объектно-ориентированных языков называют это методом вызова и используют более традиционный синтаксис методов вызова. Сборка мусора - тоже что-то очень странное, объект C основан на подсчете ссылок старой школы. Поэтому вам будет трудно принять его, если вы перейдете с другого языка. Я пишу книгу «Руководство по быстрой миграции на объект C» для программистов на C / C ++, надеясь помочь людям быстрее уловить все различия.