можно ли программировать на макбуке
Я разработчик приложений, неделю пользуюсь MacBook Air на M1. Какие впечатления?
Был у меня MacBook Pro 13 2017 i5 16GB, сейчас взял самый базовый Air на M1.
Взял самый базовый, таĸ ĸаĸ:
▪️ ближайшая доставĸа
▪️ непонятно, ĸаĸ с софтом для меня будет на М1, поэтому решил на старте не переплачивать. Если всё будет ОК, я просто обновлюсь на более сильную железĸу в плане оперативной памяти.
Переезжать на него начал в понедельниĸ. Пару дней уже полностью на нём работаю.
Что хорошего заметил
1. ТИ-ШИ-НА, при любой нагрузĸе. Иногда ĸажется что жужжит. Но
жужжит у меня в правом ухе, а не сам ноут.
2. Почти весь софт работает без проблем. Ниже опишу нюансы.
3. Тянет нормально 4ĸ и 4ĸ+встроенный дисплей, нет занижения фпс, анимации гладĸие.
i5 мог споĸойно начать жужжать просто при
подĸлючении 4ĸ мониĸа. А с отĸрытой ĸрышĸой + 4ĸ эĸран видно было, что интерфейс и анимации не плавные.
МОМЕНТАЛЬНО (!) переĸлючается между режимами «тольĸо монитор» и «монитор+встроенный дисплей». Вжух – два эĸрана, вжух – один. i5 гасил все дисплеи на неĸоторое время и чего-то там переподĸлючал, и тольĸо потом поĸазывал ĸартинĸу. При этом всё лагало.
Я это делал, ĸогда был запущен ZOOM, чтобы вĸлючить веб-камеру. На время переĸлючения я не слышал собеседниĸов, и меня тоже не было слышно.
4. Интерфейс ĸоторый не зависит от того, что там делает софт. Если ĸаĸая-то софтина легла, остальной интерфейс в порядĸе. И это очень непривычно. Всегда стабильные анимации, поĸаз приложений,
переĸлючения, всё без лагов и тормозов.
5. Автономность очень крутая. Сегодня был групповой созвон в сĸайпе. Длился 4 часа 42 минуты.
Ноутбук я зарядил вечером и снял с зарядĸи. Созвон был с утра до середины дня. После него оставалось 21% батареи.
При этом я не заĸрывал ни Xcode, ни браузер, ни Telegram. Skype был под розеттой.
Нюансы разработки
1. Первая БОЛЬ — AppCode, в ĸотором я пишу непосредственно весь ĸод, работает тольĸо через Розетту. И это не юзабельно.
Памяти он «сьедает» много (гигов 6 споĸойно), отправляет всех в своп. При это сам работает с низĸим FPS, интерфейс подлагивает.
Еще и отлаживаться у меня через него не получилось, просто не цепляется дебаггером. Ошибĸа, и всё тут.
Хотя плагин TabNine для подсĸазоĸ подтянулся и работал, но поĸа от AppCode пришлось отĸазаться. Временно буду писать ĸод на Xcode, грустить и ждать, ĸогда JetBrains сделают сборĸу под ARM.
Поĸа что есть сборĸи тольĸо для IDEA. Она, ĸстати, отлично себя ведёт. Приятно, не лагает.
Вот таĸ бы выглядела моя память, если юзать AppCode постоянно:
А вот сравнивая тот же проеĸт с IDEA под ARM.
2. Не все либы-зависимости поддерживают М1, благо, потихоньĸу делают сборĸи под М1. Например несĸольĸо библиотеĸ с файрбейза не умеют в М1, у них есть специальные ARM-сборĸи. Нашёл у них на гитхабе в треде специальном.
Теперь появился дополнительный ĸод, при установĸе зависимостей, ĸоторый смотрит процессор, и выбирает версию библиотеĸи. Вот таĸим образом я зафиĸсил эту проблему:
3. Неĸоторые заморочĸи для того, чтобы запустить свой проеĸт.
Возился недолго, но StackOverFlow и весь инет пестрит ворĸэраундами и сомнительными решениями, а-ля «вырубите arm64
и у вас соберётся билд». А ĸаĸой в этом смысл-то тогда? И редĸо находятся нормальные решения.
4. Вывод из свопа иногда дурит. Пару раз Xcode пришлось перезагружать.
5. Неĸоторый софт проще использовать через браузер, чем через их приложение, в которое они завернули тот же хром. Из Safari ресурсов «сьедает» меньше, чем их решение.
Фигма из приложения Фигмы:
6. В AppCode на M1 софт готов быстрее. В первые дни, поĸа всё устанавливал, сравнивал сĸорость индеĸсации файлов на AppCode. Т.е. время от запусĸа до готовности нормально подсĸазывать и возможности нормально работать с кодом.
Итого: когда машина уже загружена ĸучей софта, AppCode на М1 готов сильно быстрее, процентов на 25, чем на i5.
А вот на чистом старте, после перезагрузĸи, запусĸ на М1 проигрывал: 7 сеĸунд и 17 сеĸунд.
17 сеĸунд — если это первый запусĸ после перезагрузĸи. Ощущение, что там розетта чёт подтягивалась.
7 сеĸунд – уже второй. И это стабильно.
Последующие же индеĸсации и процессинги на М1 происходят быстрее. И это приятно. Жаль, что AppCode поĸа не годится для работы с ĸодом
7. Очень порадовало, что билды можно собирать сразу под Mac. Т.е. мне теперь не нужен симулятор для тестирования, приложение нативно собирается и запусĸается, ĸаĸ приложение сĸаченное с App Store для
iOS. Работает быстро и шустро. И лишней обёртĸи нет.
Причём эта же сборĸа готова ĸ установĸе на подĸлюченный для тестирования девайс. Обычно сборĸи под девайс и под симулятор разные.
Еще ĸрутая фича: доступно больше фунĸционала, чем на симуляторе. Это почти ĸаĸ телефон, но с ограничениями. Например, того же CallKit поĸа нет. Хотя все тоĸены выдаются. А вот пуши работают. И это радует!
На симуляторе есть другой, ĸонечно, фунĸционал для отладĸи и тестирования, но именно таĸого нет. Симулятор теперь у меня тольĸо для проверĸи под разные эĸраны остался. И всё. Удобно. Они и таĸ ĸучу места занимают, а теперь не будут. Каждый симулятор весит по 1-2 ГБ. А если их 10. и разных версий iOS.
Но есть другой нюанс: ĸаждая сборĸа создает новый файл приложения.
8. О сĸорости сборĸи iOS билдов. Приведу пример на своём проеĸте, но это субъеĸтивно. У ĸого-то
может быть более сложный проеĸт и результаты будут отличаться.
На М1, в рамĸах рабочей сессии, ĸогда всё отĸрыто, замерял сборĸу холодную, с 0. По 10 замеров. Среднее время:
▪️ Xcode нативно: 31.18с
▪️ Xcode под розеттой: 51.01с
▪️ На перегруженном i5, ничего не отĸрыто: 73.15с
30 сеĸунд против 73! Это потрясающе.
Лучшее время после перезагрузĸи М1:
▪️ Xcode, нативно: 26.9с
▪️ Xcode, rosetta: 41.4с
Сделал замер в рамĸах рабочей сессии ĸогда отĸрыто всё на i5. И… жутĸий результат: шум, нагрев, 95-99 градусов, 176.3 сеĸунды
Короче сильно влияет, ĸаĸие задачи я делаю воĸруг. Третий – вообще листал Telegram-чат, а первые по вебу лазил, почта, и всяĸое.
Если ĸратĸо по нюансам разработĸи:
▪️ Почти весь софт оĸ
▪️ AppCode нужно ждать ARM
В остальном всё сильно лучше чем на прошĸе 13 с i5. Быстро, тихо, ĸомфортно и не лагает.
9. Теперь у меня живёт два терминала. Один под Розетту и один нативный, чтобы не переĸлючать постоянно галочĸу.
Что ещё могу сказать
1. Bluetooth-периферия стала работать лучше, не отваливается, ĸаĸ на Intel, просто «потому что». Особенно после перезапусĸа системы.
2. Странный баг Шуры с пурпурными оĸнами… Но, думаю, решится позже.
3. С обновлением 11.1 поменяли имя процессора в системе. Было
Apple Processor или Virtual Apple Processor (если под розеттой). Стало Apple M1.
4. Натĸнулся на перезагрузку из-за проблемы в системе, просто берет и перезагружается. Зависания самой системы, банально подфризило. Но это исĸлючение из правил, чем правило (все из-за AppCodе).
Один раз отвалилось всё, ĸроме мышĸи и сĸролла. Спасла перезагрузка.
5. Но самое крутое — ТИ ШИ НА. i5 при аĸтивной работе — неумолкающая турбина. Особенно ночью ее слышно везде. Бывает, заĸроешь ноут, уйдёшь спать, слышишь, что компьютер жужжит, приходишь и принудительно уводишь в сон.
6. Ноут греется при аĸтивной работе. Колени можно греть, да, но греется чисто по центру, там где М1 стоит.Но не обжигает. Просто тёплый или горячий.
7. Клавиатура мягче и тише, чем на Magic Keyboard 2.
MacBook для программиста. Стоит ли?
Стоит! Конечно стоит!
Любой маковод расскажет 100 аргументов, почему стоит пользоваться макбуком и я один из них. Я фанат Apple и полностью всегда плюсую за эту технику. В статье хочу объяснить почему я так считаю.
Начну, все-таки, с недостатков.
Да, действительно, маки-буки дороже, чем остальная техника. Да, вам придется раскошелиться. Но! Не забывайте про вариант б/у компьютера. У меня сейчас MacBook Pro 15’ 2013г., который повидал до меня двух хозяев и прекрасно работает без нареканий.
Других недостататков я не нашел…поэтому переходим к плюсам.
Техника apple собирается очень качественно. Корпус сделан из чистого алюминия, все подогнано тютелька в тютельку, ничего не висит, не болтается, не отваливается, не люфтит. Берешь его в руки и приятно…как, собственно, все у apple)
А если вы его когда-нибудь еще и разберете. то увидите еще и внутреннюю красоту MacBook-а. Все вымерено, выверено, вентиляторы ровно друг напротив друга стоят. Красота!
Раньше я не понимал людей, которые работают на тачпадах. На всех ноутбуках тачпады дико маленькие и не удобные, но на маке работать тачпадом одно удовольствие.
Во-первых, он огромный!
Во-вторых, он настроен идеально! Я бы сказал он настроен для MacOS. Так как я ставил на свой бук windows и вот там этим тачем так же не удобно работать, как и во всех ноутбуках. Но когда запускаю MacOS, все меняется. Это рай.
Ох…забыл сказать, что тачпад поддерживает очень много жестов. И вы можете не просто двигать мышь, а еще…в общем много чего вы можете…тут лучше один раз увидеть, чем сто раз прочитать.
На всех маках стоит операционная система MacOS. Она очень простая.
Вы правильно прочитали. Он не виснет. Практически…Конечно, как и любая техника он может зависнуть, но не так как Windows. Если в случае чего, Windows зависает полностью и на долго, то в MacOS зависает только «тяжелая» программа и пока вы ждете ее «развисания» можно зайди в вк полистать новости. К тому же, эти «зависания» очень краткосрочные и приходят очень редко, поэтому вы их практически не замечаете.
Батарея держит очень долго. От 3 до 6 часов в зависимости от нагрузки. Но при активном пользовании, такая радость продолжится пару лет, потом срок службы подходит к концу и вы привязываетесь к зарядке на всегда)
Но даже при умирающей батарее, ваш ноутбук сможет спокойно проработать часочек-другой, чтобы на встрече с клиентом показать дизайн-проект.
Теперь подходим к тому, почему это удобно для программистов.
Короче говоря, для тех, кто уже пользуется Линуксом, ничего не меняется, кроме того, что вам бонусом идет еще и стройный ноутбук с красивой продуманной операционной системой.
А те, кто не хочет останавливаться в разработке сайтов на простых html-страничках, рано или поздно придет к какому-то фреймворку, который будет требовать UNIX-подобной операционной системы.
Да, на Windows это все можно будет так же делать. Но на linux или mac это будет гораздо проще, без гемора и без лишних танцев с бубном.
Поэтому резюмируя заголовок статьи, то ДА, на MacBook очень удобно программировать, это возможно и это нереально круто!
В конце хочу еще рассказать некоторые общие вопросы не касаемо плюсов и минусов, но на них просто необходимо ответить.
Когда я купил первый MacBook все вокруг про меня говорили, что я купил его для понтов. Хотя у меня даже мыслей таких не было. Наверное, завидовали.
2) Мой первый MacBook проработал на меня 6 лет. Каждый день с утра и до вечера он с упорной верностью помогал мне зарабатывать деньги разработкой сайтов. 6 лет! Вдумайтесь! Много вы знаете компьютеров, которые готовы прожить столько? И учитывайте, что у меня ноутбук работает день и ночь.
По опыту скажу, что мой первый ноутбук проработал 2 года и у него отломался экран, а второй ноутбук проработал 2 месяца и сгорел….вывод можете сделать сами.
И последний совет: Как выбрать MacBook?
Знаете чем мне нравится apple? Тем, что с ней не надо задаваться этим вопросов. Не думайте о том сколько процессоров у вас или сколько оперативной памяти. Не надо. Вы покупаете хорошо отстроенный аппарат, который в любом случае будет быстро и удобно работать.
Для покупки вам нужно определиться с двумя вещами:
Для чего вам компьютер?
Глобально, техника Apple делится на 3 сектора:
Сколько у вас есть денег?
Чем дальше от пункта А, к пункту В из первого вопроса, цена значительно увеличивается. Поэтому подумайте что вы хотите купить, что можете себе позволить и возможно придется подумать на вариантом б/у.
Удачи в программировании и, надеюсь, покупке MacBook)
Нет ни одного комментария. Вы будете первым!
Чтобы оставить комментарий, вам необходимо авторизоваться или зарегистрироваться
Привет, зашедший на эту страницу человек! Меня зовут Петров Александр и я веду этот блог.
Тут я пишу свои мысли о мире разработки сайтов и выкладываю различные мини-уроки и фишечки.
Подходит ли Mac OS для изучения программирования?
Доброго времени суток, уважаемые.
Поступаю в университет на факультет, связанный с программированием.
В связи с этим, мне нужен хороший ноутбук. По всем моим параметрам (легкость, практичность и мощность) подошел MacBook Pro 2014 года максимальной сборки, а именно Intel Core i7 (Turbo Boost до 4ГГц), 16 GB RAM, NVIDIA GTM 750M.
• Алгоритмические, объектно-ориентированные, функциональные и низкоуровневые языки программирования (С, С++, C#, Java, Delphi, Assembler и др.);
• инструментальные среды разработки ПО (IntelliJ IDEA, Eclipse, Microsoft Visual Studio и др.);
• программные платформы (.NET Framework, Java);
• web-технологии (PHP, HTML, CSS, XML, JavaScript, J2EE (JSP, Servlet), ASP.NET, Silverlight, WCF и др.);
• операционные системы: семейств Windows и Unix;
• пакеты прикладных программ для решения задач технических вычислений (MathCad, MathLab и др.);
• графические редакторы (CorelDRAW);
• локальные и глобальные сети, базы данных, распределённые БД, СУБД (Oracle, MySQL, MS SQL Server и др.);
• современные технологии разработки и тестирования программного обеспечения (Rational Rose, BPwin, ERwin, Enterprise Architect, WinRunner, SilkTest и др.);
• интегрированные пакеты в экономике (1С и др.), автоматизация деятельности банка, экспертные системы;
Если же нет, посоветуйте, пожалуйста, хороший ноутбук для решения подобного рода задач.
Бесит иногда, да, но все-же.. Как в том стишке, «никогда его не брошу, потому что он хороший..».
Ладно, все это лирика, давайте по пунктам.
Даже взять вот инструменты написания научных статей, Майкрософт и пальцем не пошевелил чтобы что-то сделать в этом направлении. И бедные наши доценты так все и набирали по-старинке в древнем LaTeX превдоформатирование, чтобы их формулы хоть как-то выглядели..
По моему мнению, MS допустило огромную ошибку, оставив академическую среду за бортом. Ибо именно оттуда выходят специалисты, которые являются движителем прогресса, в том числе с точки зрения пользователей.
В то же самое время, под конец 90х, в Apple возвращается Стив Джобс с Джонни Айвом и делает сразу три шикарнейших хода:
0) Продает пиксар за дохуллион денег
1) Вместо опостылевших и однообразных серых ящиков привносит на рынок «статусные» мыльницы, которые сразу разлетаются по всем дизайнерским студиям, адвокатским бюро и тд
Без прикрас, эти три шага, сделанные в небольшой срок, стали революцией на рынке. Я даже не постесняюсь сказать что именно они определили облик всей IT-индустрии на данный момент.
0) Продажа пиксара дала возможность влить денег в достаточно спорный ход с дизайном и операционкой, в тот момент никто не верил в дизайн и функциональность.
1) Эксклюзивный и узнаваемый дизайн в итоге привлек адептов эппла практически во всех узкоспециализированных (и денежных) секторах, как то: финансы, архитектура, графический дизайн, веб-дизайн, музыка (да, RISC архитектура этому сильно способствовала изначально). Профильные компании, такие как Adobe, Autodesk, Macromedia и тд, сфокусировались именно на разработке инструментов для пользователей Mac и оптимизировали свои продукты для них, оставляя пользователей Windows на потом. Это, в свою очередь, заставляло все новых специалистов приобретать маки, чтобы иметь возможность работать полноценно.. Получился замкнутый круг.
То есть, как бы не хайпили по поводу псевдо-статусности устройств эппл, они изначально делали решения именно для специалистов, заворачивая все это в привлекательный дизайн. В западных странах в то время именно специалисты имели потребительскую способность выше среднего, поэтому покупали это спокойно и с удовольствием. Так что статус появился позже чем функционал, это важно.
Этот пункт, мне кажется, один из самых важных, кстати.
Далее, командная строка. Как бы PuTTy ни старался, но до простого терминала ему далеко. Даже не знаю в чем именно проблема, но PuTTy это боль, а альтернатив особо и нет. Но ssh нужен постоянно, поэтому тут без вариантов.
Поиск: я хз как они это делают, но на маке поиск по всему компу очень быстр (причем, всегда был таковым). То есть, я знаю как они это делают (индексирование всего и вся, по умолчанию), я не понимаю почему винда этого не делает. Любой файл находится за 1-2 секунды. Это реально помогает.
Мультискрин: это даже на линуксах есть уже давно. Несколько рабочих областей, с простым переключением. Очень удобно, даже работая с несколькими мониторами.
Пишите в комментариях ваши мысли по этому поводу, обсудим.
Лига фрилансеров
1.3K постов 15.8K подписчик
Правила сообщества
Не забывайте поддерживать авторов плюсами!
— Добавлять нетематические посты, последнее решение за модератором
— Рекламировать какую-либо продукцию в виде постов
— Делится любыми интересными историями, связанными с фрилансом 🙂
>> Профильные компании, такие как Adobe, Autodesk, Macromedia и тд, сфокусировались именно на разработке инструментов для пользователей Mac
С 97-го года занимаюсь 3д графикой и анимацией, картина какбэ чучуть не так видится.
Некоторое время (начало нулевых) на маке было комфортнее работать с адобовским софтом, но недолго, достаточно быстро уравнялось.
Холиварная тема. По большей части потому, что в русскоязычном сегменте бытует мнение о слишком высокой цене на профессиональную технику Apple. Да, с колесиками для новых десктопов они конечно перегнули палку, но мейнстрим в виде макбуков Pro/Air стоит аналогично функциональным аналогам от других производителей, внизу я привел ссылки на обзоры сегментов.
Корпусом макбука можно забивать гвозди, читать текст на ретине это как вытирать задницу шелком (до нормального маштабирования интерфейса в win10 даже обладание 4к монитором не облегчало ситуацию, все было слишком мелким). Божественное автономное время, которое сильно выручает при долгих перелетах (ну правда это уже не эксклюзив). Удобный интерфейс и тачбар с форстачем который сейчас клонируют все подряд. Вот только за идею убрать физический ескейп (от которой они кстати отказались) я бы убивал.
Да, сейчас можно найти аналогичные ноутбуки. Но стоить они будут те же деньги, и эппл тупо был в этой нише первым.
PS: Кстати если так не хватает нормального терминала в винде, WSL в помощь. Нативный баш/ssh
PS: Желающим убедиться в тезисе «стоит аналогично функциональным аналогам» можно почитать что-то типа https://www.laptopmag.com/best-ultrabooks или https://www.laptopmag.com/articles/best-business-laptops
Понятно, что на вкус и цвет все фломастеры разные, но в целом ценовой сегмент одинаков.
Ну а еще самое пожалуй главное для меня, работая на маке ты разрабатываешь софт в среде близкой к той в которой она будет исполняться (ну если говорить о серверных разработках) и во многих случаях это оказывается значимым плюсом.
Создание программ для Mac OS X. Часть 1: вступление и Objective-C
Я думаю все слышали про Mac OS X как операционную систему для дизайнеров и домохозяек. Но хочется рассказать про средства разработки для OS X, а то хорошие программы пишут, а на чем — никто не знает.
Сразу скажу, что не буду рассказывать про кроссплатформенные фреймворки и тулкиты(такие как Qt) или про создание консольных приложений, я расскажу про то, что в плане создания приложений отличает Mac OS X от других операционных систем, а именно — фреймворк Cocoa. Оговорюсь сразу, что буду стараться избегать сравнений с другими фреймворками, я хочу просто рассказать про Cocoa.
Заглянем немного в историю. Mac OS X — дальнейшее развитие ОС NextSTEP. NextSTEP была первой ОС в которой очень широко использовался язык Objective-C, на нем была написана большая библиотека готовых объектов, причем как и обычные типы данных — строки, массивы, словари, так и объекты, используемые для построения GUI приложений. Поэтому, большая часть приложений под NextSTEP писалась на Objective-C с использованием готовых объектов. Эта самая библиотека и переросла в Cocoa framework.
Но включать в новую ОС почти незнакомый никому API было бы крайне плохим решением, поэтому добавили еще 2: Classic и Carbon.
Classic создан для того, чтобы запускались приложения Mac OS 9, на данный момент рассматривать его бессмысленно, т.к. после перехода на процессоры фирмы Intel по понятным причинам Classic был выкинут из системы.
Carbon был создан чтобы легко перенести приложения из Mac OS 9 в OS X, с возможностью добавить к уже готовому коду программы новую функциональность, доступную только в десятке. Как ни странно, но много приложений до сих пор написаны на Carbon(например MS Office for Mac и некоторые продукты Adobe).
На данный момент фреймворки Carbon и Cocoa развиваются паралельно, но со следующего релиза Mac OS X будут развивать только Cocoa.
Основным языком разработки под Cocoa является Objective-C, а поскольку в дальнейшем все примеры будут идти на этом языке, то впервой части я расскажу именно про него. Но если вы уже владеете Python или Ruby, то изучать Objective-C вам не надо, в XCode 3.0(срада разработки, о ней в следующей части) биндинги для этих языков «искаропки».
Язык программирования Objective-C
Помимо широкого известного и распространенного объектного расширения языка С — языка С++ — есть и другое его расширение — язык Objective-C, обладающий огромной простотой, полной совместимостью с языком С и очень мощной и выразительной объектной моделью, заимствованной из языка Smalltalk.
Язык был придуман Брэдом Коксом (Brad Cox) в начале 80-х годов прошлого века. Целью Кокса было создание языка, поддерживающего концепцию software IC. Под этой концепцией понимается возможность собирать программы из готовых компонент (объектов), подобно тому как сложные электронные устройства могут быть легко собраны из набора готовых интегральных микросхем (IC, integrated curcuits). При этом такой язык должен быть достаточно простым и основанным на языке С, чтобы облегчить переход разработчиков на него.
Одной из целей было также создание модели, в которой сами классы также являются полноценными объектами, поддерживалась бы интроспекция и динамическая обработка сообщений.
Получившийся в результате язык Objective-C оказался крайне прост — его освоение у С-программиста займет всего несколько дней. Он является именно расширением языка С — в язык С просто добавлены новые возможности для объектно-ориентированного программирования. При этом любая программа на С является программой и на Objective-C (для языка С++ это не верно).
Еще одной из особенностей языка является то, что он message-oriented в то время как С++ — function-oriented. Это значит, что в нем вызовы метода интерпретируются не как вызов функции (хотя к этому обычно все сводится), а именно как посылка сообщения (с именем и аргументами) объекту, подобно тому, как это происходит в Smalltalk-е. Такой подход дает целый ряд плюсов — так любому объекту можно послать любое сообщение. Объект может вместо обработки сообщения просто переслать его другому объекту для обработки (так называемое делегирование), в частности именно так можно легко реализовать распределенные объекты (т.е. объекты находящиеся в различных адресных пространствах и даже на разных компьютерах). Привязка сообщения к соответствующей функции происходит непосредственно на этапе выполнения.
Язык Objective-C поддерживает работу с метаинформацией — так у объекта непосредственно на этапе выполнения можно спросить его класс, список методов (с типами передаваемых аргументов) и instance-переменных, проверить, является ли класс потомком заданного и поддерживает ли он заданный протокол и т.п.
В языке есть нормальная поддержка протоколов (т.е. понятие интерфейса объекта и протокола четко разделены). Для объектов поддерживается наследование (не множественное), для протоколов поддерживается множественное наследование. Объект может быть унаследован от другого объекта и сразу нескольких протоколов (хотя это скорее не наследование протокола, а его поддержка).
На данный момент язык Objective-C поддерживается компилятором gcc. Довольно много в языке перенесено на runtime-библиотеку и сильно зависит от нее. Вместе с компилятором gcc поставляется минимальный вариант такой библиотеки. Также можно свободно скачать runtime-библиотеку от компании Apple: Apple’s Objective-C runtime. Эти две runtime-библиотеки довольно похожи (в основном отличие заключается в именах методов), хотя далее я буду ориентироваться на runtime-библиотеку от компании Apple.
Синтаксис языка
В языке Objective-C для обозначения объектов используется специальный тип id. Переменная типа id фактически является указателем на произвольный объект. Для обозначения нулевого указателя на объект используется константа nil. Кстати про id: движок игры Doom разрабатывался на рабочих станциях Next, так что может есть связь между типом id и названием idSoftware.
Для посылки сообщений используется следующий синтаксис:
[receiver message];
Сообщение может также содержать параметры:
[myRect setOrigin:30.0 :50.0];
В этом примере именем метода (сообщения) является setOrigin. Обратите внимание, что каждому передаваемому аргументу соответствует ровно одно двоеточие. При этом в приведенном примере первый аргумент имеет метку (текст перед двоеточием), а второй — нет.
Язык Objective-C позволяет снабжать метками каждый аргумент, что заметно повышает читаемость кода и снижает вероятность передачи неправильного параметра.
[myRect setWidth:10.0 height:20.0];
В этом примере в качестве имени сообщения выступает setWidth:height:.
Также поддерживается возможность передачи произвольного количества аргументов в сообщении:
[myObject makeGroup: obj1, obj2, obj3, obj4, nil];
Как и функции, сообщения могут возвращать значения, при этом в отличии от языка С, типом возвращаемым по умолчанию значения является id.
float area = [myRect area];
Результат одного сообщения можно сразу же использовать в другом сообщении:
[myRect setColor:[otherRect color]];
Как уже говорилось, в Objective-C классы сами являются объектами. Основной задачей таких объектов (называемых class objects) является создание экземпляров данного класса. При этом само имя класса играет двойную роль — с одной стороны оно выступает как тип данных (т.е. он может быть использован для описания указателей на объекты данного класса). А с другой стороны имя класса может выступать в качестве объекта, которому посылается сообщение ( в сообщениях имя класса может принимать участие только как receiver). В языке Objective-C нет встроенного типа для булевских величин, поэтому обычно такой тип вводится искусственно. Далее я буду для логических величин использовать тип BOOL с возможными значениями YES и NO(ИМХО более понятней, но не так “политкорректно” как true/false).
Создание новых классов
Все новые директивы компилятору в языке Objective-C начинаются с символа @. Как и в С++ описание класса и его реализация разделены (обычно описание помещается в заголовочные файлы с расширением h, а реализации — в файлы с расширением m).
Ниже приводится общая структура описания нового класса:
@interface ClassName: SuperClass
<
instance variable declarations
>
method declarations
end
В версии runtime от Apple все классы имеют общего предка — класс NSObject, содержащий целый ряд важных методов. Описание переменных ничем не отличается от описания переменных в структурах в языке С:
@interface Rect: NSObject
<
float width;
float height;
BOOL isFilled;
NSColor * color;
>
end
Каждое описание начинается со знака плюс или минус. Знак плюс обозначает, что данный метод является методом класса (т.е. его можно посылать только class object’у, а не экземплярам данного класса). Фактически методы класса являются аналогами статических методов в классах в языке С++. Знак минус служит для обозначения методов объектов — экземпляров данного класса. Обратите внимание, что в Objective-C все методы являются виртуальными, т.е. могут быть переопределены.
Ниже приводятся описания возможных методов для класса Rect.
@interface Rect: NSObject
<
float x, y;
float width;
float height;
BOOL isFilled;
NSColor * color;
>
+ newRect;
— (void) display;
— (float) width;
— (float) height;
— (float) area;
— (void) setWidth: (float) theWidth;
— (void) setHeight: (float) theHeight;
— (void) setX: (float) theX y: (float) theY;
end
Обратите внимание, что имя метода может совпадать с именем instance-переменной данного класса (например, width и heigh).
Тип возвращаемого методом значения указывается в круглых скобках сразу же после знака плюс или минус (но перед названием метода). Если тип не указан, то считается, что возвращается значение типа id. Далее идет имя метода, где после каждого двоеточия задается тип аргумента (в круглых скобках) и сам аргумент. Язык Objective-C позволяет для аргументов метода задавать также один из следующих описателей — oneway, in, out, inout, bycopy и byref. Данные описатели служат для задания направления передачи данных и способа передачи.
Для подключения заголовочного файла в Objective-C вместо директивы #include используется директива #import, полностью аналогичная #include, но гарантирующая что данных файл будет подключен всего один раз.
Реализация методов класса выглядит следующим образом:
#import «ClassName.h»
@implmentation ClassName
method implementations
end
Ниже приводится пример реализации методов класса Rect, описанного ранее.
#import «Rect.h»
+ newRect <
Rect * rect = [[Rect alloc] init];
[rect setWidth: 1.0f];
[rect setHeight: 1.0f];
[rect setX: 0.0f y: 0.0f];
>
— (float) width < return width; >
— (float) height < return height; >
— (float) area < return [self width] * [self height]; >
— (void) setWidth: (float) theWidth < width = theWidth; >
— (void) setHeight: (float) theHeight < height = theHeight; >
— (void) setX: (float) theX y: (float) theY <
x = theX;
y = theY;
>
end
Как видно из примера выше, в методах доступны все instance-переменные. Однако, как и в С++, есть возможность управлять видимостью переменных (видимостью методов управлять нельзя) при помощи директив private, protected и public (действующих полностью аналогично языку С++).
Как работает механизм сообщений
Компилятор переводит каждую посылку сообщения, т.е. конструкцию вида [object msg] в вызов функции objc_msgSend.
Эта функция в качестве своего первого параметра принимает указатель на объект-получатель сообщения, в качестве второго параметра выступает т.н. селектор, служащий для идентификации посылаемого сообщения. Если в сообщении присутствуют аргументы, то они также передаются objc_msgSend как третий, четвертый и т.д. параметры. Далее происходит поиск подходящей функции среди функций данного класса, если такой не найдено, то среди функций родительского класса, если и там не найдено, то среди функций родительского класса родительского класса( 🙂 ) и т.д. Если метод (т.е. соответствующая ему функция) находится, то осуществляется его вызов с передачей всех необходимых аргументов.
В противном случае объекту дается последний шанс обработать сообщение перед вызовом исключения — селектор сообщения вместе с параметрами «заворачивается» в специальный объект типа NSInvocation и объекту посылается сообщение forwardInvocation:, где в качестве параметра выступает объект класса NSInvocation.
Если объект поддерживает forwardInvocation:, то он может либо сам обработать посылаемое сообщение, либо переслать другому объекту для обработки:
— (void)forwardInvocation:(NSInvocation *)anInvocation
<
if ( [someOtherObject respondsToSelector: [anInvocation selector]] )
[anInvocation invokeWithTarget: someOtherObject];
else
…
>
Создание и уничтожение объектов
В самом языке Objective-C нет специальных команд для создания и уничтожения объектов (подобных new и delete). Эта задача ложится на runtime-библиотеку и реализуется при помощи механизма посылки сообщений.
Создание нового объекта разбивается на два шага — выделение памяти и инициализация объекта. Первый шаг реализуется методом класса alloc (реализованном в классе NSObject), который выделяет необходимое количество памяти (данный метод используется для выделения памяти не только для объектов класса NSObject, но и любого унаследованного от него класса). При этом выделяемая память обнуляется и в атрибут isa записывается указатель на class object соответствующего класса.
Обратите внимание, что сообщение alloc посылается class object-у требуемого класса и это сообщение возвращает указатель на выделенную под объект память.
Собственно сама инициализация объекта (т.е. установка значений его instance-переменных, выделение дополнительных ресурсов и т.п.) осуществляется другими методами, по традиции имена этих методов начинаются с init. Обычно такое сообщение посылается сразу же после сообщение alloc, по адресу, возвращенному этим сообщением.
id anObject = [[Rectangle alloc] init];
При создании нового класса обычно нет необходимости переопределять метод alloc, а вот необходимость переопределения метода init возникает достаточно часто (хотя во многих случаях можно положится на обнуление памяти alloc’ом).
Обратите внимание, что метод(ы) init является обычным методом, ничем не выделяющимся среди остальных (в отличии от С++, где конструктор — это особый метод, у которого например нельзя взять адрес). Поэтому при создании нового класса и метода init вызов переопределенного метода init (при помощи [super init]) должен быть произведен явно в самом начале метода.
Mac OS X (как и NextStep) для управления временем жизни объектов используют reference counting — каждый объект содержит внутри себя некоторый счетчик, при создании устанавливаемый в единицу.
Посылка объекту сообщения retain увеличивает значение этого счетчика на единицу (так все контейнерные классы библиотеки Foundation при помещении в них объекта, посылают ему сообщение retain). Установившейся практикой является посылка объекту сообщения retain всеми, заинтересованными в нем сторонами (объектами), т.е. если вы запоминаете ссылку на объект, то следует послать ему сообщение retain.
Когда объект перестает быть нужен, то ему просто посылается сообщение release. Данное сообщение уменьшает значение счетчика на единицу и, если это значение стало меньше единицы, уничтожает данный объект.
Перед уничтожением объекта ему посылается сообщение dealloc, позволяющее объекту произвести свою деинициализацию. При этом это также является обычным сообщением и в нем Вы явно должны в конце вызвать унаследованную реализацию через [super dealloc].
Objective-C 2.0
На WDC2006 Apple представила новую версию языка — 2.0. Среди нововведений были отмечены сборка мусора, быстрая энумерация, свойства в классах, 64-битная поддержка и многое другое. Следует отметить, что эти нововведения доступны только для Leopard.
Сборка мусора
Objective-C 2.0 позволяет производить автоматическую сборку мусора, правда это опционально.
Свойства
Ранее для изменения и чтения instance variables необходимо было писать методы возврата и задания значения(т.н. getters and setters), теперь можно писать так:
@interface Person: NSObject <
>
@property(readonly) NSString *name;
@property(readonly) int age;
-(id)initWithName:(NSString)name age:(int)age;
end
Получить имя можно так:
NSString *name = aPerson.name;
Быстрая энумерация
Теперь добавлен аналог оператора foreach:
for (Person *p in thePeople) NSLog(@»%@ is %i years old.», [p getName], [p getAge]);
Для первой части хватит. При составлении статьи были использованы материалы сайтов developer.apple.com и steps3d.narod.ru(кстати единственный сайт, на котором есть информация про программирование в Mac OS X на русском).
В следующей части расскажу про среду разработки XCode и редактор интерфейсов Interface Builder, а также покажу создание совсем простенького приложения.