• Swift-фреймворк в Objective-C-приложении

    Хоть Apple и написали, казалось бы, подробную документацию о том, как можно использовать Swift-код внутри Objective-C-приложения (и наоборот), но когда доходит до дела, этого почему-то окаывается недостаточно. Когда в проекте, в котором я задействован, появилась необходимость обеспечить совместимость Swift-библиотеки одного из продуктов компании с Objective-C-приложением одного из клиентов, документация Apple породила больше вопросов, чем дала ответов (ну или по крайней мере оставила множество пробелов). Интенсивное использование поисковых систем показало, что данная тема освещена в Сети довольно скудно: парочка вопросов на StackOverflow, пара-тройка вводных статей (на англоязычных ресурсах, конечно) – вот и все, что удалось найти.

    Данная статья является обощением найденной информации, а также полученного опыта. Подчеркну, она не претендует на то, чтобы называться, как говорится, хорошей практикой, а лишь предлагает возможные действия в описанных обстоятельствах или является неким академическим экспериментом.
    Читать дальше →
  • Знакомство с движком AVAudioEngine для работы со звуком на iOS

      Просматривая рунет в поисках статей на эту тему, удивляешься их отсутствию. Возможно, людям хватает описания в хэдере класса, а может, все просто предпочитают изучать его опытным путём. Так или иначе, для тех, кто первый раз сталкивается с этим классом или чувствует потребность в наглядных примерах, мы предлагаем это несложное практическое руководство от наших партнеров, Music Topia.

      В плане работы со звуком Apple находится впереди своих конкурентов, и это неспроста. Компания предлагает хороший инструментарий для проигрывания, записи и обработки треков. Благодаря этому на AppStore можно увидеть огромное количество приложений, которые так или иначе работают с аудиоконтентом. В их число входят проигрыватели с хорошим звуком (Vox), аудиоредакторы с инструментами для редактирования и наложения эффектов (Sound Editor), приложения, изменяющие голос (Voicy Helium), различные симуляторы музыкальных инструментов, которые дают довольно точную имитацию соответствующего звучания (Virtuoso Piano), и даже симуляторы DJ-установок (X Djing).



      Для работы с аудио Apple предоставляет фреймворк AVFoundation, который объединяет в себе несколько инструментов. Например, AVAudioPlayer используется для проигрывания одиночного трека, а AVAudioRecorder — для записи звука с микрофона. И если вам нужны только функции, предоставляемые этими классами, то просто используйте их. Если же вам необходимо наложить какой-либо эффект, проигрывать несколько дорожек одновременно, микшировать их, заняться обработкой или редактированием аудио или записать звук с выхода определенного аудиоузла, то с этим вам поможет AVAudioEngine. Больше всего данный класс привлекает возможностью наложения эффектов на трек. Как раз на основе этих эффектов построена уйма приложений с эквалайзерами и возможностью изменить голос. Кроме того, Apple позволяет разработчикам создавать свои эффекты, генераторы звука и инструменты.
      Читать дальше →
    • Оптимизация производительности UIKit

      • Перевод
      Несмотря на то, что много статей и видео с конференций WWDC посвящены производительности UIKit, эта тема до сих пор непонятна многим IOS разработчикам. По этой причине мы решили собрать наиболее интересующие вопросы и проблемы, от которых в первую очередь зависит скорость и плавность работы UI приложения.

      Первая проблема, на которую стоит обратить внимание — это смешивание цветов.
      Читать дальше →
    • Как описывать layout в коде

      What do we have?


      UI можно определить как набор вьюх, которые отображают данные, реагируют на события и при этом каким-то определенным образом расположены на экране.


      Как мы размещаем элементы на экране?


      • Qt предлагает использовать контейнеры, умеющие внутри себя располагать элементы определенным образом. Вкладывая эти контейнеры друг в друга, можно получить необходимую расстановку.
      • WPF/XAML предлагает аналогичные контейнеры.
      • Android предлагает аналогичные контейнеры + систему констреинтов.
      • iOS предлагает Autolayout. Нужно описать набор ограничений (уравнений), непротиворечиво и однозначно описывающих расположение элементов. Решив систему уравнений с этими ограничениями, движок получит координаты и размеры элементов.
      • У Delphi есть anchors: прибивание краев к контейнеру. Очень похоже на resizing masks в iOS.
      • В web на сколько я понимаю используется вкладывание друг в друга контейнеров, поведение которых описывается стилями.

      What is the problem with this?


      We need to use code for special cases


      Описанные инструменты заточены под типовые случаи, зачастую мы не можем (или можем, но это сильно неудобно) описать расположение какого-то элемента с помощью этих инструментов. Приходится делать это в коде. Логика описания layout'а размазывается по нескольким местам.
      Должен быть способ лучше.

      Читать дальше →
      • –1
      • 1,9k
      • 5
    • Swift не нужен?

      • Перевод
      Не перестаю задаваться вопросом — какие у Apple планы на Swift и Objective-C? Когда в 2014 году появился Swift, его создатель Крис Латтнер утверждал, что эти два языка смогут сосуществовать бесконечно долго. Из почтовой рассылки пользователям Xcode:
      3 Июня 2014
      McLaughlin, Michael P.
      Кто-нибудь знает, действительно ли Apple собирается прекратить поддержку С и С++? Fortran уже не поддерживается, хотя осталось еще много кода на Fortran, и сравнительно нового, как в MultiNest.
      Пожалуйста, скажите, что это не так. Не все считают, что «опытные пользователи» — это те, кто просто создает полнометражные мультики. Многие из них ученые и инженеры.

      Здравствуйте, Michael,
      Мы не строили планы на что-либо подобное. Swift — это просто новый вариант разработки под платформу. Мы не собираемся прекращать поддержку ни C, ни C++, ни Objective-C. Если вы разрабатываете на одном из этих языков, можете свободно продолжать его использовать.

      — Крис.
      Оригинальный текст письма
      > On Jun 3, 2014, at 5:45 AM, McLaughlin, Michael P. <mpm...@mitre.org> wrote:
      > Does anyone know, for real, if Apple intends to stop supporting C and C++?
      > That’s what it sounded like. They already do not support Fortran even though
      > there is a *lot* of Fortran code out there, even fairly new code like MultiNest.
      >
      > Please say it isn’t so. Not all of us consider “power users” to be just those
      > who create feature-length cartoons. Many are scientists and engineers.

      Hi Michael,

      We have no plans to do anything like that. Swift is a new option for developing
      on the platform. We have no plans to drop C, C++ or Objective-C. If you’re
      happy with them, please feel free to keep using them.

      -Chris


      Дело в том, что в это никто не верит. Крис Латтнер уже давно покинул Apple, и если его утверждение окажется ложным, он не сможет принять критику от лица компании. В целом разработчики согласились на том, что Apple в конечном итоге откажется от Objective-C, и Swift станет единственным языком «первого класса» для разработки Cocoa-приложений.
      Читать дальше →
    • Swift 4 — слабые ссылки

      • Перевод
      Вскоре после публикации исходного кода Swift, я написал статью о том как реализованы слабые ссылки. Время не стоит на месте и всё меняется, реализация слабых ссылок в Swift тоже. Сегодня я расскажу о новой реализации и сравню ее со старой. Спасибо Guillaume Lessard за идею для поста.

      Старая реализация


      Для тех из вас кто не помнит старую реализацию и кому лень пробежаться по предыдущей статье я кратко опишу ее здесь.

      В старой версии Swift объекты имели 2 счетчика ссылок: счетчик для сильных ссылок и счетчик для слабых. Когда счетчик сильных ссылок становится равен нулю, а слабых еще нет — объект уничтожается, но память не освобождается. Поэтому в памяти остается так называемый “зомби объект” на который ссылается слабая ссылка.

      Когда слабая ссылка загружается, среда времени выполнения (runtime) проверяет является ли объект “зомби”. Если он “зомби” то runtime обнуляет слабую ссылку и уменьшает счетчик слабых ссылок на 1. Когда счетчик слабых ссылок достигает 0 — память освобождается (deallocated). Это означает, что полностью объект удаляется только тогда, когда все слабые ссылки на него обнуляются.

      Мне нравилась простота этой реализации, но были у нее и недостатки:
      Читать дальше →
    • AdBlock похитил этот баннер, но баннеры не зубы — отрастут

      Подробнее
      Реклама
    • MBLTdev 2017: amazing iOS-трек

        image

        Напоминаем, что 27 октября в пространстве Digital October пройдёт 4-я ежегодная конференция мобильных разработчиков MBLTdev 2017.

        Под катом: описания докладов iOS-трека, CodeLabs, небольшой опрос и подарки от JetBrains, Ray Wenderlich и Skyeng.
        Читать дальше →
      • По итогам Rambler.iOS #9


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


          Читать дальше →
        • Как мы боремся c динамическими библиотеками в Swift. Опыт Яндекса

            Честно говоря, когда мы приступили к работе над перезапуском Яндекс.Карт, я и представить себе не мог, сколько проблем нам в итоге доставит Swift. Если вы начали писать на Swift совсем недавно, то, поверьте, вы пропустили все самое интересное. Каких-то два года назад не было инкрементной компиляции в принципе (даже пробел в любом файле приводил к полной пересборке), сам компилятор постоянно вылетал с Segmentation Fault на вполне безобидных вещах вроде тройной вложенности типов или наследования от Generic, индексация проекта длилась невообразимо долго, автодополнение работало через раз и так далее и тому подобное, всех бед не счесть. Подобные моменты несомненно усложняют жизнь программистам, но постепенно решаются с каждым обновлением Xcode. Однако есть более существенные проблемы, влияющие не только на разработку, но и на качество приложения: запрет компиляции статических библиотек из свифтового кода, а также отсутствие поддержки Swift на уровне iOS.


            Изначально не было очевидно, что использование Swift и динамических библиотек приводит к росту времени запуска. Мы не сравнивали время запуска с предыдущей версией и воспринимали долгую загрузку как данность. Да и средств диагностики того, что же на самом деле происходит на этапе загрузки приложения, в общем-то не было. Но в один прекрасный день разработчики Apple добавили возможность профилирования работы системного загрузчика. Оказалось, что загрузка динамических библиотек занимает очень много времени по сравнению с другими этапами. Конечно, с нашим кодом тоже не все было идеально, но, пожалуй, это частные особенности отдельного приложения и не всем будет интересно о них читать. А вот борьба с динамическими библиотеками — общая тема для всех разработчиков, использующих Swift. Именно об этой проблеме и пойдет речь.

            Читать дальше →
          • Делаем встроенные покупки (in-app purchase) в приложении под iOs 10 на Objective C

            • Tutorial
            Недавно решил добавить встроенные покупки в одно из моих приложений для изучения английского языка. Не нашел ни одного вменяемого урока по добавлению встроенных покупок на Objective C. Все уроки либо очень старые, либо на Swift. Здесь хочу предложить вашему вниманию довольно простое решение, которое я использовал в своем приложении, сделанном на Objective C в Xcode 8.
            Читать дальше →
            • –5
            • 2,6k
            • 3
          Самое читаемое