码迷,mamicode.com
首页 > 移动开发 > 详细

IOS高级开发~Runtime(四)

时间:2016-05-12 11:57:25      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

用C代替OC:


#import <objc/runtime.h>

#import <objc/message.h>

#import <stdio.h>


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



struct Rect {

  float x;

  float y;

  float width;

  float height;

};

typedef struct Rect Rect;



void *navController;

static int numberOfRows =100;




int tableView_numberOfRowsInSection(void *receiver,structobjc_selector *selector, void *tblview,int section) {

  returnnumberOfRows;

}


void *tableView_cellForRowAtIndexPath(void *receiver,structobjc_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 = (intobjc_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,structobjc_selector *selector, 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 = (intobjc_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_numberOfRowsInSection,nil);

  class_addMethod(DataSource,sel_registerName("tableView:cellForRowAtIndexPath:"), (void(*))tableView_cellForRowAtIndexPath,nil);

  objc_registerClassPair(DataSource);

  returnclass_createInstance(DataSource,0);

}


void * createDelegate() {

  Class superclass = (Class)objc_getClass("NSObject");

  Class DataSource = objc_allocateClassPair(superclass,"Delegate",0);

  class_addMethod(DataSource,sel_registerName("tableView:didSelectRowAtIndexPath:"), (void(*))tableView_didSelectRowAtIndexPath,nil);

  objc_registerClassPair(DataSource);

  returnclass_createInstance(DataSource,0);

}




void applicationdidFinishLaunching(void *receiver,structobjc_selector *selector, void *application) {

  Class windowClass = (Class)objc_getClass("UIWindow");

  void * windowInstance = class_createInstance(windowClass, 0);

    

  objc_msgSend(windowInstance, sel_registerName("initWithFrame:"),(Rect){0,0,320,480});

  

  //Make Key and Visiable

  objc_msgSend(windowInstance,sel_registerName("makeKeyAndVisible"));


  //Create Table View

  Class TableViewController = (Class)objc_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)objc_getClass("UINavigationController");

  navController = class_createInstance(NavController,0);

  objc_msgSend(navController,sel_registerName("initWithRootViewController:"),tableViewController);

  void *view =objc_msgSend(navController,sel_registerName("view"));

  

  //Add Table View To Window

  objc_msgSend(windowInstance, sel_registerName("addSubview:"),view);

}



//Create an class named "AppDelegate", and return it‘s name as an instance of class NSString

void *createAppDelegate() {

  Class mySubclass = objc_allocateClassPair((Class)objc_getClass("NSObject"),"AppDelegate",0);

  structobjc_selector *selName =sel_registerName("application:didFinishLaunchingWithOptions:");

  class_addMethod(mySubclass, selName, (void(*))applicationdidFinishLaunching,nil);

  objc_registerClassPair(mySubclass);

  returnobjc_msgSend(objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),"AppDelegate");

}



int main(int argc, char *argv[]) {

  returnUIApplicationMain(argc, argv,0,createAppDelegate());

}



运行效果:

技术分享


IOS高级开发~Runtime(四)

标签:

原文地址:http://blog.csdn.net/flying_in_the_world/article/details/51371944

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!