Что эквивалентно +[NSObject load] для категории в экземпляре

Как вы по категориям можете переопределить статический метод

+ (void)load
{
    // do any setup for the class
}

Мне интересно, как я могу сделать тот же PR-экземпляр. Неужели нужно метить init-метод?

1 ответ

Нет, AFAIK нет способа для этого. Вместо этого сделайте что-то вроде этого

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface NSObject (XXXCategory)
@end

@implementation NSObject (XXXCategory)

- (void)xxx_setup
{
    static void * XXXDidSetupPropertKey;
    NSNumber *didSetupValue = objc_getAssociatedObject(self, XXXDidSetupPropertKey);    BOOL didSetup = [didSetupValue boolValue];
    if(!didSetup)
    {
        objc_setAssociatedObject(self, XXXDidSetupPropertKey, @YES, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        NSLog(@"Setting up category");
    }
}

- (void)xxx_doSomething
{
    [self xxx_setup];
    NSLog(@"do something");
}

- (void)xxx_doSomethingElse
{
    [self xxx_setup];
    NSLog(@"do something else");
}

@end

При тестировании, как это

NSObject *obj = [[NSObject alloc] init];
[obj xxx_doSomething];
[obj xxx_doSomethingElse];

Результат

2014-02-28 10:21:04.024 Untitled 2[27026:507] Setting up category
2014-02-28 10:21:04.025 Untitled 2[27026:507] do something
2014-02-28 10:21:04.026 Untitled 2[27026:507] do something else
Другие вопросы по тегам