alibaba / wax

Wax is a framework that lets you write native iPhone apps in Lua.
http://github.com/probablycorey/wax
MIT License
1.84k stars 280 forks source link

重写父类中的函数导致的崩溃问题 #36

Closed zhudaye12138 closed 8 years ago

zhudaye12138 commented 8 years ago

若修改父类中的A函数,而它的子类又没有被lua修改时。调用子类会崩溃,错误是子类里面没有A函数。

原因: waxDefinedSelectorClassDictionary 里没有注册子类

修改方法: 修改 isClassSelectorDefinedInWax函数

`BOOL isClassSelectorDefinedInWax(NSString klassStr, NSString selStr){ if(klassStr == nil || selStr == nil) return NO;

BOOL isDefined = NO;
if(waxDefinedSelectorClassDictionary){
    //derived calss forwarding selector will use base class's forwarding

    BOOL hasInWax = waxDefinedSelectorClassDictionary[klassStr];
    while (!hasInWax && ![klassStr isEqualToString:@"NSObject"]) {
        klassStr =[NSString stringWithFormat:@"%@", [NSClassFromString(klassStr) superclass]];
        hasInWax = waxDefinedSelectorClassDictionary[klassStr];
    }//fix crash

    while (!isDefined && hasInWax) {
        NSArray *replaceMethodList = waxDefinedSelectorClassDictionary[klassStr];
        for(NSDictionary *dict in replaceMethodList){
            NSString *tmpClassStr = dict[@"class"];
            NSString *tmpSelStr = dict[@"sel"];
            if(tmpClassStr && [tmpClassStr isEqualToString:klassStr] &&
               tmpSelStr && [tmpSelStr isEqualToString:selStr]){
                isDefined = YES;
                break;
            }
        }//for

        if(!isDefined){
            Class klassSuper = [NSClassFromString(klassStr) superclass];
            klassStr = NSStringFromClass(klassSuper);
        }
    }
}

return isDefined;

}`

不知道这样处理会不会有其他的问题?