8.3.3 Method Signatures

This section documents the encoding of method types, which is rarely
needed to use Objective-C. You should skip it at a first reading; the
runtime provides functions that will work on methods and can walk
through the list of parameters and interpret them for you. These
functions are part of the public “API” and are the preferred way to
interact with method signatures from user code.

But if you need to debug a problem with method signatures and need to
know how they are implemented (i.e., the “ABI”), read on.

Methods have their “signature” encoded and made available to the
runtime. The “signature” encodes all the information required to
dynamically build invocations of the method at runtime: return type
and arguments.

The “signature” is a null-terminated string, composed of the following:

The return type, including type qualifiers. For example, a method
returning int would have i here.

The total size (in bytes) required to pass all the parameters. This
includes the two hidden parameters (the object self and the
method selector _cmd).

Each argument, with the type encoding, followed by the offset (in
bytes) of the argument in the list of parameters.

For example, a method with no arguments and returning int would
have the signature i8@0:4 if the size of a pointer is 4. The
signature is interpreted as follows: the i is the return type
(an int), the 8 is the total size of the parameters in
bytes (two pointers each of size 4), the @0 is the first
parameter (an object at byte offset 0) and :4 is the
second parameter (a SEL at byte offset 4).

You can easily find more examples by running the “strings” program
on an Objective-C object file compiled by GCC. You’ll see a lot of
strings that look very much like i8@0:4. They are signatures
of Objective-C methods.