Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

Objective-C selectors

Как известно, селекторы в Objective-C - это уникальные адреса строк в памяти, которые используются objc_msgSend для диспетчеризации сообщений. Уникальность обеспечена неким механизмом интернирования. При этом он работает как на этапе компиляции (директива @selector), так и во время выполнения программы (функция sel_registerName или NSSelectorFromString). Пытался понять как это работает - получилось.

Все банально просто - компилятор создает отедельную секцию __objc_selrefs данных для всех селекторов, используемых ключевым словом @selector:

                                       ; 
                                       ; Section __objc_selrefs
                                       ; 
                                       ; Range 0x100002678 - 0x1000026a0 (40 bytes)
                                       ; File offset 9848 (40 bytes)
                                       ; Flags : 0x10000005
                                       ; 
                                            objc_sel_point:
0000000100002678                                 dq         0x00000001000019c4            ; XREF=0x100001485, 0x100001543
                                            objc_sel_init:
0000000100002680                                 dq         0x00000001000019de            ; XREF=0x100001607, 0x1000016b8, 0x10000170c, 0x1000017a7
                                            objc_sel_setHelloText_:
0000000100002688                                 dq         0x00000001000019e3            ; XREF=0x100001633, 0x1000016d3, 0x100001727
                                            objc_sel_stringWithFormat_:
0000000100002690                                 dq         0x00000001000019f1            ; XREF=0x10000167d
                                            objc_sel_description:
0000000100002698                                 dq         0x0000000100001a18            ; XREF=0x1000017d4, 0x1000018eb

Ну, а sel_registerName возваращает элемент из этого списка, если он найден, в противном случае - адрес строки из какого-то динамического списка времени выполнения.

Есть еще нюанс - работает ли @selector сквозь модули? Подозреваю, что нет.

1 коммент.:

Анонимный комментирует...

I think the admin of this site is genuinely working hard for his site, since here every stuff is quality based information.
Feel free to surf my website - GFI Norte

Отправить комментарий

Copyright 2007-2011 Chabster