И ещё, интересно, насколько хороши SpriteKit, UI***Behavior и другие новые «игровые» API iOS 7.0 для разработки 2d игр? Насколько они могут заменить Cocos2d + box2d и их аналоги?
— Вам не приходилось слышать про Федерика Тернера?
— Нет, сэр.
— Он был историком. Лет сто назад он придумал теорию о границе. Граница — это нечто вроде
предохранительного клапана цивилизации, чтобы мы совсем не сошли с ума. Когда появляются
люди, неспособные жить, как все — безумцы, недовольные, экстремисты — они устремляются на
границу. Вот как рождалась Америка: все сумасшедшие бунтари в Европе собрались и отправились
на границу, из которой родились 13 колоний. Потом самые непоседливые двинулись дальше на
запад. Поэтому в конце концов все психи оказались в Калифорнии.
Тернер умер в 32-м, так что не увидел, что стало с миром, в котором кончились новые границы.
Некоторые говорят, что есть еще граница разума. Они изучают чудесный мир наркотиков и
алкоголя, но это не та граница, очередной самообман. Мы придумали ложную границу с
компьютерами, которая позволяет людям думать, что они сбежали, граница с платой за доступ.
— А космос — последняя граница?
— Стартрек — это не космос, это телевидение. Тоже не граница. И потом — сколько народу
побывало в космосе? Нет-нет-нет, настоящая граница здесь. Автострада 60 — вот зачем ее
построили. Это место для тех, кому хочется жить по-другому.
— А это правда, мистер Коди?
— Если нет, то должно быть...
P.S. куда денется The Pirate Bay, когда какая-нибудь держава принесет «демократию» на их беспилотники, летающие в нейтральных водах? Куда поедет Сноуден или очередной Ассанж?
В простых случаях, таких как «чистые» геттеры в init, например, ничего плохого не может случится.
Но есть более сложные ситуации, и одна из них произошла у меня в реальном проекте. Я подробностей уже не помню, помню что в методе init я регистрировал свой класс-«одиночку» в KVO.
Вскоре обнаружилось, что в рантайме у меня создавались два инстанса синглтона. С тех пор я в init ничего лишнего не пишу.
Это тоже плохая практика, по своему. Во время инициализации self находится в «подвешенном» состоянии, и пока инициализация не закончена, лучше не посылать ему сообщения. Считаю что первый вариант (с ivar и проверкой self) лучше.
Don’t Message self in Objective-C init (or dealloc)
// Выделяем память, заполненную нулями
void *newObject = calloc(1, class_getInstanceSize([TestObject class]));
// Задаём isa прямой записью в память
Class *c = (Class *)newObject;
c[0] = [TestObject class];
// Здесь __bridge_transfer-каст нужен для передачи объекта в ARC - иначе утечёт
obj = (__bridge_transfer TestObject *)newObject;
// Посылаем init - объект готов!
obj = [obj init];
On iOS for arm64, the isa field of Objective-C objects is no longer a pointer.
Say what?
On iOS for arm64, the isa field of Objective-C objects is no longer a pointer.
If it's not a pointer anymore, what is it?
Some of the bits still encode the pointer to the object's class. But neither OS X nor iOS actually uses all 64 bits of virtual address space. The Objective-C runtime may use these extra bits to store per-object data like its retain count or whether it has been weakly referenced.
Why change it?
Performance. Re-purposing these otherwise unused bits increases speed and decreases memory size. On iOS 7 the focus is on optimizing retain/release and alloc/dealloc.
What does this mean for my code?
Don't read obj->isa directly. The compiler will complain if you do. Trust the Compiler. The Compiler is your friend. Use [obj class] or object_getClass(obj) instead.
Don't write obj->isa directly. Use object_setClass() instead.
If you override +allocWithZone:, you may initialize your object's isa field to a «raw» isa pointer. If you do, no extra data will be stored in that isa field and you may suffer the slow path through code like retain/release. To enable these optimizations, instead set the isa field to zero (if it is not already) and then call object_setClass().
If you override retain/release to implement a custom inline retain count, consider removing that code in favor of the runtime's implementation.
The 64-bit iOS simulator currently does not use non-pointer isa. Test your code on a real arm64 device.
Hello Erica.
I'm a russian iOS software developer. I'm going to write an article concerning iOS development, especially undocumented features. As you appear to be significant (probably most significant) person in this area, I considered to append references to your books, blog and GitHub projects to my article. My article is to be written in russian, and I should adopt your name to russian language.
Therefore, my question is: How do you pronounce your second name?
I mean, does it sound more like word «sudden» or «sah dune»? Or maybe quite different? BTW, I'm familiar with phonemic notations (like IPA).
Of course I'll add your name in original spelling, too.
With best regards, Oleg Trakhman.
А вот какой ответ получил :))
Zdravstvoi!
It's sah-DOON
Spaceba, — E
Не часто пишу письма, а на английском тем более, но это было забавно :)
Хочу написать дополнение к посту, в которой написал бы всю подноготную этих 5 строчек, но пока не хватает времени.
1) Apple Review Team проанализирует программу статическим анализатором (nm/strings/otool/grep), найдут строчки "_statusBar" и ''_currentRawData", и поймут что программист обращаются к приватным переменным. С моим подходом такого не произойдет. В каком-то смысле это обфускация.
2) Хотелось создать интригу, чтобы хабралюди сами попытались разобраться, что происходит.
писать
Вообще с objective-c дикое количество boilerplate'а выходит.
Строго говоря, блоки не являются частью Objective-C, это расширение языка C.
Blocks (C language extension)
Cocaine целебный людям он везёт.
Ничего себе, получается что переменные класса теперь можно объявлять внутри @implementation? Когда это появилось?
Трасса 60
P.S. куда денется The Pirate Bay, когда какая-нибудь держава принесет «демократию» на их беспилотники, летающие в нейтральных водах? Куда поедет Сноуден или очередной Ассанж?
Лучше бы я сам не написал.
Такого не может быть?
давно и неправдасделано через+initialize
, когда не было еще ни GCD, ни блоков…init
, например, ничего плохого не может случится.Но есть более сложные ситуации, и одна из них произошла у меня в реальном проекте. Я подробностей уже не помню, помню что в методе init я регистрировал свой класс-«одиночку» в KVO.
Вскоре обнаружилось, что в рантайме у меня создавались два инстанса синглтона. С тех пор я в
init
ничего лишнего не пишу.Неактуально.
www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html
It's sah-DOON
Spaceba, — E
Не часто пишу письма, а на английском тем более, но это было забавно :)
Кстати, rain.simplynoise.com/
1) Apple Review Team проанализирует программу статическим анализатором (nm/strings/otool/grep), найдут строчки "_statusBar" и ''_currentRawData", и поймут что программист обращаются к приватным переменным. С моим подходом такого не произойдет. В каком-то смысле это обфускация.
2) Хотелось создать интригу, чтобы хабралюди сами попытались разобраться, что происходит.