Pull to refresh

Comments 15

Спасибо вам за серию статей. С удовольствием читаю, хотя никогда не писал на obj c.

«моего любимого языка»
Не холивара ради, хочу спросить. Скажите, а это действительно правда? Ну, то есть вас не раздражает синтаксис а-ля «вырви глаза», а также, например, огромное количество скобочек и @? Особенно, когда вышел свифт.
Спасибо за отзыв. Да, я действительно люблю этот язык, как и C++ или Python. Синтаксис — согласен с Вами, уродливый. Но, как заметил один из комментаторов предыдущей статьи: «любовь зла, полюбишь и козла» :).
А я даже проникся синтаксисом и люблю в нём почти всё. Особенно, когда появились литералы @{}, @[] и прочие. Для примера, по мне следующий код гораздо читабельнее, чем его C*/Java аналог:
// ObjC
[obj setName:@"Foo" age:10];

// C++
obj.setNameAndAge(@"Foo",10);
.

А часто методы еще более сложные, и в скобках получается каша из параметров.
Спасибо, жду продолжения!
Кстати, в примере с добавлением метода вместо
 [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) код,

[myObj appleSecret];


компилироваться не будет.

По поводу ссылки на gnustep — я бы тоже поспорил, так как там реализация рантайма именно от GNU, а она имеет фундаментальные отличия от apple-овского рантайма.

И большое спасибо за Ваш интерес к статьям, уже не первый раз замечаю Вас в комментариях :).
И все из-за ограничений ARC, хотя в этой одной строчке вся суть механизма сообщений — посылай что хочешь кому хочешь, это не вызов функции. Сейчас же с появлением ARC и swift исчезает все больше динамики, а swift так вообще просто еще один мультипарадигменный язык со своим синтаксическим сахаром.
Вы абсолютно правы! Проблема в том, что я занялся iOS-разработкой уже после появления ARC, и понял причину проблемы только после Вашего замечания. Спасибо! :)
UFO just landed and posted this here
Насколько я помню, тут все из-за возвращаемого значения. По-умолчанию для всех подобных вызовов возвращаемым типом является id и ARC не знает, что с ним делать. Для ARC эта информация обязательна.
Достаточно в проекте отключить ARC и подобный код будет без проблем компилироваться и максимум выдаст предупреждение о неизвестном селекторе. Этот код полностью валидный, но с приходом ARC он теперь является ошибкой.
UFO just landed and posted this here
Да ничем, по сути. Просто в первом случае ARC выдает ошибку, а во втором случае выдает только предупреждение — мол, надеюсь ты знаешь, что ты делаешь, потому что я не ручаюсь за возвращаемое значение. И это действительно так — с performSelector предупреждение и гласит, что может быть утечка памяти — ARC дает возможность сделать такое, но не ручается за управление памятью, потому что он без понятия о том, что делать с возвращаемым значением.

Такие уж костыли на пути отказа от динамики — какую-то обратную совместимость надо было оставить. До 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
UFO just landed and posted this here
Спасибо за минусы, но можно поинтересоваться, за что? Я думаю всем будет полезно узнать как же все работает на самом деле, раз я написал что-то неправильно.
А что за параметры передадуться в appleSecret при вызове и что такое IMP?
Sign up to leave a comment.

Articles