About “Header file not found”

I had a project, which has a static library with references to header files like this:

I couldn’t change this import line, since it was in source files, that are located in static libraries. Also, it is a bad practice to change tons of source files instead of changing just the location of header files folder in the project. I couldn’t realize what should I do, to make Xcode find those header files? I also had a folder with header files, that I can import to the project. I wasted about two days to figure out this problem but at the end I solved it.

The error was the following:

This is the solution.

  1. I created a folder of this structure : Libetpan/libetpan/libetpan.h.
  2. All header files were inside Libetpan/libetpan. Then I put this folder Libetpan to the project next to my *.xcodeproj file.
  3. Then I added this “./Libetpan” to the Build Settings of my Target in Header Search Paths without recursion.

So the most important thing here is that we should put the folder with correct structure to the project. For example, if header is imported this way: #import the folder structure must be Libetpan/libetpan/(header files).

This is the topic in StackOverflow.

How to generate random key in iOS

It is a common task to generate a random n char string (alphanumeric string). It can be solved the following way. First, we generate an alphabet, that has m chars. Then in a cycle we generate random indexes from 0 to (m-1) and take a char from alphabet with random index.

Inspired by this post

Setting breakpoints on all methods in XCode

To be able to set breakpoints on all methods do the following:

  1. Switch to LLDB debugger. Go to Edit Schemes, click Run, on Info panel choose this debugger.
  2. Run your app, pause it and type the following on log:

    Here, “.” is a regular expression, where to put breakpoints. In this case it will put everywhere on everymethod. “-s” means that breakpoints will be put only in your project files, not frameworks.
  3. “br list” command allows to look at all breakpoints list. You can’t see them on Xcode UI and they will be removed after the next Run.

Using LLDB we can put breakpoint on all ViewDidLoad methods by name, for example.

Also, we can put breakpoints by selector name:

Inspired by this solution.

More about LLDB debugger.

If XCode indexing doesn’t work

This started to be pretty common problem for me, because I am making a very complicated project with tons of source files, that’s why I decided to paste a solution here.

If XCode indexing doesn’t work or by other words, if code sense is not working, try this:

  1. Open Organizer in XCode by pressing Shift + Cmd + 2
  2. Open your project tab
  3. Delete derived data

Screenshot:

XCode will reindex your project and code sense should start working.

The second thing, that you can do:

  1. Open Build Settings of your project
  2. Find Header Search Paths parameter
  3. Add this : $(SRCROOT)/**
  4. Reopen your project

It helped me once.

Solutions were taken from here.

XCode – создание шаблонного кода

Чтобы создать шаблон или заготовку кода, в который потом планируется что-то дописать и создать аналогичный метод или написать похожий код, можно использовать тот же прием, который использует сам Apple в XCode, когда создает для нас подсказки. А именно, нужно заключать изменяемую часть кода в символы <# и #>. Например:

Это также используется в документации Apple и XCode:
https://developer.apple.com

Поиск строки в файлах в Mac OS X

Часто требуется найти не файлы по названию, а строки в файлах или файлы, содержащие какую-то строку или регулярное выражение. Чтобы найти какую-либо строку во всех файлах в данном каталоге или рекурсивно по всем каталогам, нужно использовать команду grep.

grep — утилита командной строки, которая находит строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их».

Например:

Эта команда выведет все названия файлов, содержащих “123abc” и имеющих расширение “html”.

Полное описание команды можно получить используя команду:

Пример поиска строки во всех вложенных файлах в данной папке (без рекурсии по вложенным папкам):

Данная команда выведет все строки во всех вложенных папках, которые содержат слово “topic”

Пример поиска строки в файле:

Эта команда выведет все строки в файле 1.txt, содержащие слово ‘Matthew’.

Пример поиска строки во всех файлах рекурсивно по всем вложенным папкам:

Здесь звездочка означает любой файл. -l выводит список файлов вместо строк, -r – рекурсия. Можно ставить как одинарные, так и двойные кавычки. Названия файлов тоже могут быть в кавычках, если содержат пробелы.

Пример простого поиска с регулярным выражением:

Данная команда выведет все строки из файла 1.txt, которые содержат сочетание(не обязательно слово) “Contr”. Каретка^ означает начало, доллар$ – конец. Точка(.) – любой символ, кроме новой строки, звездочка(*) – повторение предыдущего символа любое число раз.

Пример сложного поиска с регулярным выражением:

Здесь -i означает то, что grep будет case-insensitive. Все, что находится в одинарных кавычках – регулярное выражение, которое мы ищем. Команда ищет все htm и html файлы рекурсивно по всем папкам.

Если нужно сохранить результат поиска (список файлов) в файл, нужно дописать следующее:

Если нужно отредактировать все файлы, содержащие подходящие строки, нужно просто команду заключить в кавычки след. образом:

Источник информации для данной статьи:
http://hints.macworld.com/article.php?story=20001105214242629

Справочник по регулярным выражениям

Краткий коспект книги “Путь программиста”

Прочитал недавно эту книгу. Авторы – Александр Никитин и Дмитрий Ляпин. Решил записать несколько тезисов своими словами, чтобы не забыть ее содержание. В целом же книга учит тому, как расти программистам в профессиональном плане. Книга дает рекоммендации для программистов с разным опытом и т.д. Я же пишу то, что извлек лично для себя.

  1. Практика написания кода важнее, чем чтение книг о программировании и чем посещение курсов, прослушивание лекций в вузе и т.п.
  2. Для того, чтобы достичь успеха, нужно определиться с целями, понять чего ты хочешь, а затем составить план для развития.
  3. Нужно развиваться гармонично. То есть иметь хобби различные, заниматься спортом и т.д.
  4. Нужно описывать грабли, на которые наступаешь, чтобы не повторять ошибок.
  5. Совершенствоваться в написании качественного кода.
  6. Быть на гребне волны (знать о современных технологиях и веяниях).
  7. Читать блоги разных гуру в своей сфере.
  8. Поддерживать физическое и эмоциональное состояние. Так как оно влияет на продуктивность.
  9. Готовиться к собеседованиям и правильно себя вести на них.
  10. Правильно отдыхать.
  11. Прочитать следующие книги: Искусство программирования, ООП анализ и проектирование (Гради Буч), Совершенный код (Стив Макконнел), Как создаются программные системы (Чапел, Брукс), Приемы ООП проектирования (Э.Гамма и др.), Как пасти котов.

Почему GitHub так важен для iOS разработчиков

Сегодня я прозрел как разработчик iOS приложений, спустя год после начала разработки под эту платформу, и решил с вами поделиться этим. Наверное, это прозрение, этот момент, наступает, когда разработчик уже ознакомился в целом почти со всеми возможностями нативных(родных) фреймворков от Apple.

Повторное использование кода существенно ускоряет разработку. Вообще, ООП (объектно-ориентированное программирование) изначально создавалось с такой идеей, чтобы разработчики могли так же, как инженеры, создавать программы из готовых блоков, либо, по крайней мере, создавать блоки, которые были бы reusable, то есть повторно используемыми. Это одна из причин, почему просмотр Open Source проектов важен. Он позволяет увеличить собственную библиотеку повторно используемых компонентов и ускорить процесс разработки не только за счет нативных фреймворков и собственного кода, но и за счет плодов программистов со всего мира. Кроме того, за тот же срок можно сделать более интересный и качественный продукт, если использовать готовый код. А чем ты профессиональнее и чем быстрее и качественнее ты создаешь продукты, тем больше и твоя компенсация.

В тесте Yandex’а для iOS-разработчиков есть вопрос – есть ли у Вас GitHub аккаунт. Я некоторое время не мог понять, почему он так важен и обязателен.

Кроме этого, моему прозрению предшествовали многочисленные собеседования, которые я проходил. На одном из них у меня спросили, использую ли я Three20 – бесплатную Open Source библиотеку от создателя приложения для Facebook. Потом, спустя 4 месяца, я ее скачал с GitHub и изучил. Также я скачал и стал применять библиотеку MBProgressHUD, которая позволяет показывать волчок, а сам долгий процесс запускать в параллельном потоке. Также я только по необходимости скачивал оттуда MailCore.

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

В GitHub выкладывают очень много Open Source проектов, в том числе и на Objective-C (там их целых 2 процента и этот язык там на 10 месте по популярности). Многие проекты представляют огромную ценность, так как в них реализованы интересные фичи, приемы, контролы и т.д.

Например, я скачал с GitHub 4 проекта, которые были популярны сегодня. Первый позволяет отображать PDF c кучей контролов и читать его с удобством (Reader), второй – показывает различные View как Pop up с разной анимацией (MJPopupViewController), третий позволяет легко записывать видео из приложения (cam), четвертый представляет из себя по сути горизонтальный Table View (FantasyView).

В GitHub есть разделы по разным языкам и кроме этого, есть сортировка по количеству бранчей и закачек. Также, в GitHub можно посмотреть самые популярные по просмотрам проекты за день, неделю, месяц и все время. А еще – самые популярные по бранчам.

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

По аналогии, буду также просматривать Open Source раздел Google, Apple и других компаний. Все, что я здесь написал, относится не только к GitHub и не только к Objective C. Просто с них я начал.

Еще, хотелось бы добавить, для разработчика iOS важны OpenSource проекты не только на Objective C, но и на C++/C. Например, я как-то использовал ZXing и ZBar для распознования штрих-кодов.

Напоследок несколько ссылок для быстрого доступа:
Раздел GitHub на Objective C
Топовые GitHub проекты под iOS
Мой собственный аккаунт на GitHub
Google Open Source
Sample Code для разработчиков Apple
Проекты на SourceForge под iOS, наиболее популярные

MailCore CTCoreAttachment example

To add attachments in MailCore add this ONLY after setBody/setHTMLBody:

// Set Attachments
NSString *filePrefix = [[NSBundle mainBundle] bundlePath];
NSString *path = [NSString stringWithFormat:@"%@/%@",filePrefix,@"TestData/DSC_6201.jpg"];
NSLog(@"path:%@", path);
CTCoreAttachment *attach = [[CTCoreAttachment alloc] initWithContentsOfFile:path];
if ([attach data]==nil) {
    NSLog(@"Error: attachment data is nil");
}
[myMessage addAttachment:attach];

Here, you should add TestData folder with image to your project as a folder reference.

TWTweetComposeViewController doesn’t display initial tweet

TWTweetComposeViewController doesn’t display tweets, that are too long. You can take a substring of a tweet by cutting down to 140 symbols: