Weak-import classes are a useful new Objective-C feature that you
can't use yet.
Weak import is a solution when you want to use something from a
framework, but still need to be compatible with older versions of
the framework that didn't support it yet. Using weak import you
can test if the feature exists at runtime before you try to use
it.
Objective-C has not previously supported weak import for
classes. Instead you had to use clumsy runtime introspection to
check whether a class was available, store a pointer to that class
in a variable, and use that variable when you wanted to send a
message to the class. Even worse, there was no reasonable way to
create your own subclass of a superclass that might be
unavailable. Some developers put the subclass in a separate
library that was not loaded until after checking that the
superclass was present, but even that trick is not allowed on
iPhone OS.
Weak import for C functions works by checking the weak-imported
function pointer's value before calling it:
if (NSNewFunction != NULL) {
NSNewFunction(...);
} else {
// NSNewFunction not supported on this system
}
The same mechanism is a natural fit with Objective-C classes and
Objective-C's handling of messages to nil. These constructs are
much nicer than NSClassFromString() or a separate
NSBundle .
if ([NSNewClass class] != nil) {
[NSNewClass doSomething];
} else {
// NSNewClass is unavailable on this system
}
@interface MySubclass : NSNewClass ... @end
MySubclass *obj = [[MySubclass alloc] init];
if (!obj) {
// MySubclass (or a superclass thereof) is unavailable on this system
}
Weak import of Objective-C classes is now available. But you can't
use it yet. First, it's only supported today on iPhone OS 3.1;
it's expected to arrive in a future Mac OS.
Second, there's nothing you can do with weak import until the
first OS update after iPhone OS 3.1. Then you could write an app
that adopted new features in that future version, and used weak import
to be compatible with 3.1. (It still could not run on 3.0 or 2.x,
because those systems lack the runtime machinery to process the
weak import references.)
Weak import for Objective-C did not make Snow Leopard for
scheduling reasons. Assuming it ships in Mac OS X 10.7 Cat Name
Forthcoming, you won't be able to use it until Mac OS X 10.8
LOLcat.
|