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