With the NeXT/Apple runtime,
[object selector: arguments...]
is syntactic sugar for objc_msgSend(object, @selector(selector:), arguments)
With the GCC runtime, that's syntactic sugar for: IMP tmp = objc_msg_lookup(object, @selector(selector:));
tmp(object, @selector(selector:), arguments...)
No assembly necessary. I believe there are also compiler flags to assume the function won't be replaced behind your back so objc_msg_lookup can be hoisted out of a loop, etc.