
objc egg v0.4 -- Summary of changes

- Class proxies.  The objc:class wrapper for each class is now unique (rather than simply containing a pointer) and contains metadata useful to the bridge.  This makes the following features possible:
    - Instance variable memory management.  ID (instance) types are properly retained when using objc:ivar-set!, and any old value released.  Dealloc now releases these objects.
    - Interface Builder outlets.  Specifying the outlet: keyword negates memory management.
    - Instance variables can hold scheme types.  From within scheme, any access to variables marked with keyword slot: are converted to and from scheme objects.  For example, you can store a vector or closure in an instance variable.
    - Callback optimization in @ invocation.  The current heuristic is very simple: any class with a scheme implemenation in its hierarchy uses a safe call; pure Objective C classes use a normal call.  This is a big win for pure Objective C class or instance calls, a tie for Scheme class calls, and a 10% penalty for Scheme instance calls.  This can be disabled with (objc:optimize-callbacks #f).

Other changes:

- (@ ...) invocation syntax.  I have come to vastly prefer this style as opposed to @[...] because it is consistent with scheme function calls, and it nests better.  @[...] is still available.

- Hyphenated selectors.  For example, dictionaryWithContentsOfFile: can now be written as dictionary-with-contents-of-file: in any invocation.  The same is true for class method definitions: (- VOID awake-from-nib ...) is now accepted.

- (objc:wrap x) and (objc:unwrap x) wrap and unwrap a scheme object inside an Objective C object, a Scheme_Object_Wrapper.  This allows you to pass a scheme object such as a vector or closure into or out of an Objective C method implemented in Scheme.
    -- Note: this is similar to how the automatic ivar scheme types work, but those are implemented more efficiently as bare pointers to GC roots.  If you specify the wrapper: type qualifier for an ivar, it will use objc:wrap/unwrap instead; this will incur more overhead with no real benefit.

- (objc ...) and (objc/safe ...) are now (objc:send ...) and (objc:send/safe ...), respectively.  (objc:send/maybe-safe ...) uses the callback optimization desccribed above.  The old forms are still available.

Any old code (I know I am the only one writing any ;) should now use the outlet: qualifier for any Interface Builder outlets.  This is the only required change, and in fact your code will probably even work without it.

-- J. "Zbiggy" Ursetto

