iOS高级开发 RunTime机制讲解四

下载DEMO:https://github.com/sleepsheep/RunTimeDemo04
代码示例:


#import 
#import 
#import 

extern int MyUIApplicationMain(int argc, char *argv[], void *principalClassName, void *delegateClassName);

struct MyRect {
    float x;
    float y;
    float width;
    float height;
};
typedef struct MyRect MyRect;

void *navController;
static int numberOfRows = 100;

int tableView_numberOfRowInSection(void *receiver, struct objc_selector *selector, void *tblView, int section) {
    return numberOfRows;
}

void *tableView_cellForRowAtIndexPath(void *receiver, struct objc_selector *selector, void *tblView, void *indexPath) {
    Class TableViewCell = (Class)objc_getClass("UITableViewCell");
    void *cell = class_createInstance(TableViewCell, 0);
    objc_msgSend(cell, sel_registerName("init"));
    char buffer[7];
    
    int row = (int)objc_msgSend(indexPath, sel_registerName("row"));
    sprintf(buffer, "Row %d", row);
    void *label = objc_msgSend(objc_getClass("NSString"), sel_registerName("stringWithUTF8String:"), buffer);
    objc_msgSend(cell, sel_registerName("setText:"), label);
    
    return cell;
}

void tableView_didSelectRowAtIndexPath(void *receiver, struct objc_selector *seletor, void *tblView, void *indexPath) {
    Class ViewController = (Class)objc_getClass("UIViewController");
    void *vc = class_createInstance(ViewController, 0);
    objc_msgSend(vc, sel_registerName("init"));
    char buffer[8];
    int row = (int)objc_msgSend(indexPath, sel_registerName("row"));
    sprintf(buffer, "Item %d", row);
    void *label = objc_msgSend(objc_getClass("NSString"), sel_registerName("stringWithUTF8String"), buffer);
    objc_msgSend(vc, sel_registerName("setTitle"), label);
    
    objc_msgSend(navController, sel_registerName("pushViewController:animated:"), vc, 1);
}

void *createDataSource() {
    Class superclass = (Class)objc_getClass("NSObject");
    Class DataSource = objc_allocateClassPair(superclass, "DataSource", 0);
    class_addMethod(DataSource, sel_registerName("tableView:numberOfRowsInSection:"), (void (*))tableView_numberOfRowInSection, nil);
    class_addMethod(DataSource, sel_registerName("tableView:cellForRowAtIndexPath:"), (void (*))tableView_cellForRowAtIndexPath, nil);
    
    objc_registerClassPair(DataSource);
    return class_createInstance(DataSource, 0);
}

void *createDelegate() {
    Class superClass = (Class)object_getClass(@"NSObject");
    Class DataSource = objc_allocateClassPair(superClass, "Delegate", 0);
    class_addMethod(DataSource, sel_registerName("tableView:didSelectRowAtIndexPath:"), (void (*))tableView_didSelectRowAtIndexPath, nil);
    
    objc_registerClassPair(DataSource);
    return class_createInstance(DataSource, 0);
}

//自定义主函数
void applicationdidFinishLaunching(void *receiver, struct objc_selector *selector, void *application) {
    Class windowClass = (Class)object_getClass(@"UIWindow");
    void *windowInstance = class_createInstance(windowClass, 0);
    
    objc_msgSend(windowClass, sel_registerName("initWithFrame:"), (MyRect){0, 0, 320, 480});
    
    //make key and visiable
    objc_msgSend(windowInstance, sel_registerName("makeKeyAndVisible"));
    
    //创建表
    Class TableViewController = (Class)object_getClass(@"UITableViewController");
    void *tableViewController = class_createInstance(TableViewController, 0);
    objc_msgSend(TableViewController, sel_registerName("init"));
    void *tableView = objc_msgSend(TableViewController, sel_registerName("tableView"));
    objc_msgSend(tableView, sel_registerName("setDataSource"), createDataSource());
    objc_msgSend(tableView, sel_registerName("setDelegate"), createDelegate());
    
    Class NavController = (Class)object_getClass(@"UINavigationController");
    navController = class_createInstance(NavController, 0);
    objc_msgSend(navController, sel_registerName("initWithRootViewCOntroller:"), tableViewController);
    void *view = objc_msgSend(navController, sel_registerName("view"));
    
    //add TableView to window
    objc_msgSend(windowInstance, sel_registerName("addSubview:"), view);
    
}

//create an class named "AppDelegate", and return its name as an instance of class NSString
void *createAppDelegate() {
    Class mySubclass = objc_allocateClassPair((Class)object_getClass(@"NSObject"), "AppDelegate", 0);
    struct objc_selector *selName = sel_registerName("application:didFinishLaunchingWithOptions:");
    class_addMethod(mySubclass, selName, (void (*))applicationdidFinishLaunching, nil);
    objc_registerClassPair(mySubclass);
    return objc_msgSend(object_getClass(@"NNString"), sel_registerName("stringWithUTF8String:"), "AppDelegate");
}

int main(int argc, char *argv[]) {
    return MyUIApplicationMain(argc, argv, 0, createAppDelegate());
}

具体设置参照iOS高级开发 RunTime机制讲解三

你可能感兴趣的:(iOS高级开发 RunTime机制讲解四)