Используется ли class_replaceMethod для реализации функций iOS4.x в среде выполнения iOS3.x? - PullRequest
1 голос
/ 08 октября 2010

Я хочу использовать некоторые вещи из iOS 4.x в iOS 3.x.Я знаю, как их реализовать, я предполагаю, что моя реализация медленнее или может иметь больше ошибок, чем Apple, поэтому я хочу использовать Apple в любое время, когда она доступна.

Делает что-то вроде этого вменяемое:

@implementation NSDictionary (NSDictionary_4)

void compatability_method(Class class, SEL newer_version_selector, SEL compatability_selector) {
    Method existingMethod = class_getInstanceMethod(class, newer_version_selector);
    if (!existingMethod) {
        Method compatabilityMethod = class_getInstanceMethod(class, compatability_selector);
        class_replaceMethod(class, newer_version_selector, method_getImplementation(compatabilityMethod), method_getTypeEncoding(compatabilityMethod));
    }
}

+(void)load {
    if (self == [NSDictionary class]) {
        compatability_method(self, @selector(enumerateKeysAndObjectsUsingBlock:), @selector(four_enumerateKeysAndObjectsUsingBlock:));
    }
}

-(void)four_enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block {
    BOOL stop = false;

    for (id key in self) {
        block(key, [self objectForKey:key], &stop);
        if (stop) {
            break;
        }
    }
}


@end

Если это плохая идея, что было бы лучше?

(если это нормально, но код немного не в порядке, я тоже хотел бы знать это ... но яболее интересно узнать, является ли вся идея приличной или следует избегать такого рода конструкции)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...