I'm trying to declare properties that are for internal use only in a Private
category as such:
@interface BarLayer (Private)
@property (readwrite, retain) MenuItemFont *menuButton;
@property (readwrite, retain) Menu *menuMenu;
@property (readwrite, retain) LabelAtlas *messageLabel;
@end
Now I'm trying to figure out where exactly I'm supposed to @synthesize
those.
I tried:
@implementation BarLayer (Private)
@synthesize menuButton = _menuButton;
@synthesize menuMenu = _menuMenu;
@synthesize messageLabel = _messageLabel;
@end
Here, the compiler complains:
@synthesize not allowed in a category's implementation
So I tried putting it in my BarLayer
implementation, but here it doesn't find the declarations in the BarLayer
interface.
no declaration of property ‘menuButton’ found in the interface
What would the correct way be?
Best Answer
You can't use
@synthesize
with a category.You can do this with an class extension (a.k.a. anonymous category), which is just a category without a name whose methods must be implemented in the main
@implementation
block for that class. For your code, just change "(Private)" to "()" and use@synthesize
in the main@implementation
block along with the rest of your code for that class.See the Apple docs on extensions for more about that. (Apparently this is new in Mac OS 10.5.)
EDIT: An example:
Another solution, which is much more work, is to use
objc_setAssociatedObject
andobjc_getAssociatedObject
to fake additional instance variables. In this case, you could declare these as properties, and implement the setters and getters yourself using the objc_* runtime methods above. For more detail on those functions, see the Apple docs on Objective-C runtime.