IOS高级开发~Runtime(四)

IOS高级开发~Runtime(一)

IOS高级开发~Runtime(二)

IOS高级开发~Runtime(三)

IOS高级开发~Runtime(四)



用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 = (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,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 = (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_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/zfpp25_/article/details/9496705

IOS高级开发~Runtime(二)

http://blog.csdn.net/zfpp25_/article/details/9497187

IOS高级开发~Runtime(三)

http://blog.csdn.net/zfpp25_/article/details/9497721

IOS高级开发~Runtime(四)

http://blog.csdn.net/zfpp25_/article/details/9498233


  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zfpp25_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值