5.8 Objective-C FFI
The library supports Objective-C interaction in two layers. The upper
layer provides syntactic forms for sending messages and deriving
subclasses. The lower layer is a think wrapper on the
Objective-C
runtime library functions. Even the upper layer is unsafe and
relatively low-level compared to normal Racket libraries, because
argument and result types must be declared in terms of FFI C types
(see Type Constructors).
5.8.1 FFI Types and Constants
The type of an Objective-C object, an opaque pointer.
The type of an Objective-C class, which is also an
_id.
The type of an Objective-C protocol, which is also an
_id.
The type of an Objective-C selector, an opaque pointer.
The Objective-C boolean type. Racket values are converted for C in the
usual way: #f is false and any other value is true. C values
are converted to Racket booleans.
Synonym for #t
Synonym for #f
5.8.2 Syntactic Forms and Procedures
(tell result-type obj-expr method-id) |
(tell result-type obj-expr arg ...) |
|
result-type | | = | | | | | | | | #:type ctype-expr | | | | | | arg | | = | | method-id arg-expr | | | | | | method-id #:type ctype-expr arg-expr |
|
Sends a message to the Objective-C object produced by
obj-expr. When a type is omitted for either the result or an
argument, the type is assumed to be
_id, otherwise it must
be specified as an FFI C type (see
Type Constructors).
If a single method-id is provided with no arguments, then
method-id must not end with :; otherwise, each
method-id must end with :.
Examples: |
> (tell NSString alloc) |
#<cpointer:id> |
|
#<cpointer:id> |
(tellv obj-expr method-id) |
(tellv obj-expr arg ...) |
Defines each
class-id to the class (a value with FFI type
_Class) that is registered with the string form of
class-id. The registered class is obtained via
objc_lookUpClass.
Defines each
protocol-id to the protocol (a value with FFI type
_Protocol) that is registered with the string form of
protocol-id. The registered class is obtained via
objc_getProtocol.
(define-objc-class class-id superclass-expr | maybe-mixins | maybe-protocols | [field-id ...] | method) |
|
|
maybe-mixins | | = | | | | | | | | #:mixins (mixin-expr ...) | | | | | | maybe-protocols | | = | | | | | | | | #:protocols (protocol-expr ...) | | | | | | method | | = | | (mode result-ctype-expr (method-id) body ...+) | | | | | | (mode result-ctype-expr (arg ...+) body ...+) | | | | | | mode | | = | | + | | | | | | - | | | | | | +a | | | | | | -a | | | | | | arg | | = | | method-id [ctype-expr arg-id] |
|
Defines
class-id as a new, registered Objective-C class (of
FFI type
_Class). The
superclass-expr should produce
an Objective-C class or
#f for the superclass. An optional
#:mixins clause can specify mixins defined with
define-objc-mixin. An optional
#:protocols clause
can specify Objective-C protocols to be implemented by the class.
Each field-id is an instance field that holds a Racket value
and that is initialized to #f when the object is
allocated. The field-ids can be referenced and set!
directly when the method bodys. Outside the object, they can
be referenced and set with get-ivar and set-ivar!.
Each method adds or overrides a method to the class (when
mode is - or -a) to be called on instances,
or it adds a method to the meta-class (when mode is
+ or +a) to be called on the class itself. All
result and argument types must be declared using FFI C types
(see Type Constructors). When mode is +a or -a, the
method is called in atomic mode (see _cprocedure).
If a method is declared with a single method-id and
no arguments, then method-id must not end with
:. Otherwise, each method-id must end with
:.
If the special method dealloc is declared for mode
-, it must not call the superclass method, because a
(super-tell dealloc) is added to the end of the method
automatically. In addition, before (super-tell dealloc),
space for each field-id within the instance is deallocated.
(define-objc-mixin (class-id superclass-id) | maybe-mixins | maybe-protocols | [field-id ...] | method) |
|
Like
define-objc-class, but defines a mixin to be combined
with other method definitions through either
define-objc-class or
define-objc-mixin. The
specified
field-ids are not added by the mixin, but must be a
subset of the
field-ids declared for the class to which the
methods are added.
Returns a selector (of FFI type
_SEL) for the string form of
method-id.
Check whether obj is an instance of the Objective-C class
cls.
5.8.3 Raw Runtime Functions
Finds a registered class by name.
Finds a registered protocol by name.
Interns a selector given its name in string form.
Allocates a new Objective-C class.
Registers an Objective-C class.
Returns the class of an object (or the meta-class of a class).
Adds a method to a class. The
type argument must be a FFI C
type (see
Type Constructors) that matches both
imp and the not
Objective-C type string
type-encoding.
Adds an instance variable to an Objective-C class.
Gets the value of an instance variable whose type is
_pointer.
Sets the value of an instance variable whose type is
_pointer.
The type of an Objective-C instance variable, an opaque pointer.
Calls the Objective-C method on
_id named by
sel.
The
types vector must contain one more than the number of
supplied
args; the first FFI C type in
type is used
as the result type.
Constructor and FFI C type use for super calls.
5.8.4 Legacy Library