Defining a property in iOS class extension

alazaro picture alazaro · Sep 3, 2012 · Viewed 15.5k times · Source

I would like to add a property to UITableView in a Class Extension:

@interface UITableViewController ()

@property NSString *entityString;

@end

Then I import the extension and then I use entityString property in a subclass of UITableViewController:

@implementation CustomerTableViewController

- (void)viewDidLoad {
    self.entityString = @"Customer";
    ...
    [super viewDidLoad];
}
...

Apple documentation says:

the compiler will automatically synthesize the relevant accessor methods (...) inside the primary class implementation.

But when I try to execute it I get this error:

-[CustomerTableViewController setEntityString:]: unrecognized selector sent to instance 0x737b670

What am I doing wrong? maybe the property cannot be accessed by subclasses?

Answer

prashant picture prashant · Sep 3, 2012

Try using a category with Associative References instead. It is much cleaner and will work on all instances of UIButton.

UIButton+Property.h

#import <Foundation/Foundation.h>

@interface UIButton(Property)

@property (nonatomic, retain) NSObject *property;

@end


UIButton+Property.m

#import "UIButton+Property.h"
#import <objc/runtime.h>

@implementation UIButton(Property)

static char UIB_PROPERTY_KEY;

@dynamic property;

-(void)setProperty:(NSObject *)property
{
  objc_setAssociatedObject(self, &UIB_PROPERTY_KEY, property, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(NSObject*)property
{
   return (NSObject*)objc_getAssociatedObject(self, &UIB_PROPERTY_KEY);
}

@end

//Example usage

#import "UIButton+Property.h"


UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button1.property = @"HELLO";
NSLog(@"Property %@", button1.property);
button1.property = nil;
NSLog(@"Property %@", button1.property);