Комментарии 15
Спасибо вам за серию статей. С удовольствием читаю, хотя никогда не писал на obj c.
«моего любимого языка»
Не холивара ради, хочу спросить. Скажите, а это действительно правда? Ну, то есть вас не раздражает синтаксис а-ля «вырви глаза», а также, например, огромное количество скобочек и @? Особенно, когда вышел свифт.
«моего любимого языка»
Не холивара ради, хочу спросить. Скажите, а это действительно правда? Ну, то есть вас не раздражает синтаксис а-ля «вырви глаза», а также, например, огромное количество скобочек и @? Особенно, когда вышел свифт.
Спасибо за отзыв. Да, я действительно люблю этот язык, как и C++ или Python. Синтаксис — согласен с Вами, уродливый. Но, как заметил один из комментаторов предыдущей статьи: «любовь зла, полюбишь и козла» :).
А я даже проникся синтаксисом и люблю в нём почти всё. Особенно, когда появились литералы @{}, @[] и прочие. Для примера, по мне следующий код гораздо читабельнее, чем его C*/Java аналог:
А часто методы еще более сложные, и в скобках получается каша из параметров.
// ObjC
[obj setName:@"Foo" age:10];
// C++
obj.setNameAndAge(@"Foo",10);
.А часто методы еще более сложные, и в скобках получается каша из параметров.
Спасибо, жду продолжения!
Кстати, в примере с добавлением метода вместо
можно просто написать
будет warning, но все будет работать.
Для тех, у кого нет OSX и желания/возможности возиться с виртуалками, рекомендую www.tutorialspoint.com/compile_objective-c_online.php — там хоть и линукс, но с gnustep, что ближе к реальной макоси чем просто gcc (который тоже умеет компилировать objc).
Кстати, возникает вопрос — возможно ли прототипное ООП на objc, иными словами, можно ли добавить метод не в класс, а в объект; или сделать в рантайме копию объекта класса и использовать ее для некоторых объектов…
Кстати, в примере с добавлением метода вместо
[myObj performSelector:@selector(appleSecret)];
можно просто написать
[myObj appleSecret];
будет warning, но все будет работать.
Для тех, у кого нет OSX и желания/возможности возиться с виртуалками, рекомендую www.tutorialspoint.com/compile_objective-c_online.php — там хоть и линукс, но с gnustep, что ближе к реальной макоси чем просто gcc (который тоже умеет компилировать objc).
Кстати, возникает вопрос — возможно ли прототипное ООП на objc, иными словами, можно ли добавить метод не в класс, а в объект; или сделать в рантайме копию объекта класса и использовать ее для некоторых объектов…
Нет, в Xcode 6 (Mac OS X Yosemite, LLVM) код,
компилироваться не будет.
По поводу ссылки на gnustep — я бы тоже поспорил, так как там реализация рантайма именно от GNU, а она имеет фундаментальные отличия от apple-овского рантайма.
И большое спасибо за Ваш интерес к статьям, уже не первый раз замечаю Вас в комментариях :).
[myObj appleSecret];
компилироваться не будет.
По поводу ссылки на gnustep — я бы тоже поспорил, так как там реализация рантайма именно от GNU, а она имеет фундаментальные отличия от apple-овского рантайма.
И большое спасибо за Ваш интерес к статьям, уже не первый раз замечаю Вас в комментариях :).
И все из-за ограничений ARC, хотя в этой одной строчке вся суть механизма сообщений — посылай что хочешь кому хочешь, это не вызов функции. Сейчас же с появлением ARC и swift исчезает все больше динамики, а swift так вообще просто еще один мультипарадигменный язык со своим синтаксическим сахаром.
Вы абсолютно правы! Проблема в том, что я занялся iOS-разработкой уже после появления ARC, и понял причину проблемы только после Вашего замечания. Спасибо! :)
НЛО прилетело и опубликовало эту надпись здесь
Насколько я помню, тут все из-за возвращаемого значения. По-умолчанию для всех подобных вызовов возвращаемым типом является id и ARC не знает, что с ним делать. Для ARC эта информация обязательна.
Достаточно в проекте отключить ARC и подобный код будет без проблем компилироваться и максимум выдаст предупреждение о неизвестном селекторе. Этот код полностью валидный, но с приходом ARC он теперь является ошибкой.
Достаточно в проекте отключить ARC и подобный код будет без проблем компилироваться и максимум выдаст предупреждение о неизвестном селекторе. Этот код полностью валидный, но с приходом ARC он теперь является ошибкой.
НЛО прилетело и опубликовало эту надпись здесь
Да ничем, по сути. Просто в первом случае ARC выдает ошибку, а во втором случае выдает только предупреждение — мол, надеюсь ты знаешь, что ты делаешь, потому что я не ручаюсь за возвращаемое значение. И это действительно так — с performSelector предупреждение и гласит, что может быть утечка памяти — ARC дает возможность сделать такое, но не ручается за управление памятью, потому что он без понятия о том, что делать с возвращаемым значением.
Такие уж костыли на пути отказа от динамики — какую-то обратную совместимость надо было оставить. До ARC это все было валидно и предупреждало только о неизвестном селекторе. С ARC всеми силами предупреждают, что код небезопасен и лучше так не делать. Из swift это вообще полностью выпилили как небезопасный код
developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html
Такие уж костыли на пути отказа от динамики — какую-то обратную совместимость надо было оставить. До ARC это все было валидно и предупреждало только о неизвестном селекторе. С ARC всеми силами предупреждают, что код небезопасен и лучше так не делать. Из swift это вообще полностью выпилили как небезопасный код
The performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe.
developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html
А что за параметры передадуться в appleSecret при вызове и что такое IMP?
Об этом написано во второй части.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Objective-C Runtime для Си-шников. Часть 3