用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

(转发)IOS高级开发~Runtime(四)的更多相关文章

  1. (转发)IOS高级开发~Runtime(三)

    11.系统类的方法实现部分替换 - (void) methodExchange { Method m1 = class_getInstanceMethod([NSStringclass],@selec ...

  2. (转发)IOS高级开发~Runtime(二)

    一些公用类: @interface ClassCustomClass :NSObject{ NSString *varTest1; NSString *varTest2; NSString *varT ...

  3. (转发)IOS高级开发~Runtime(一)

    IOS高级开发-Runtime(一) IOS高级开发-Runtime(二) IOS高级开发-Runtime(三) IOS高级开发-Runtime(四) 一些公用类: @interface Custom ...

  4. IOS高级开发 runtime(一)

    一. 简介 IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度.要想使用runtime,首先要引入系统的头文件. <span style="font-size:18p ...

  5. iOS 高级开发 runtime(三)

    三 .动态添加方法 我们可以通过runtime动态地添加方法.那么到底啥叫动态添加方法呢?动态添加方法就是当我们程序运行时才知道我们应该调用哪个方法.我们首先需要了解这一点,当我们编写完一段代码后,我 ...

  6. IOS 高级开发 runtime(二)

    二.移魂大法 使用runtime还可以交换两个函数.先贴上代码和执行结果. #import <Foundation/Foundation.h> @interface DZLPerson : ...

  7. IOS高级开发之多线程(四)NSOperation

    1.什么是NSOperation,NSOperationQueue? NSOperation是一个抽象的基类,表示一个独立的计算单元,可以为子类提供有用且线程安全的建立状态,优先级,依赖和取消等操作. ...

  8. ios蓝牙开发(四)app作为外设被连接的实现-转发

    代码下载: 原博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo. 再上一节说了app作为central连接periphera ...

  9. IOS高级开发~Runtime(一)

    #import <Foundation/Foundation.h> @interface CustomClass : NSObject -(void)fun1; @end @interfa ...

随机推荐

  1. 2017-9-13 NOIP模拟赛[xxy]

    全排列 (permutation.cpp/c/pas)Description从 n 个不同元素中任取 m(m≤n)个元素,按照一定的顺序排列起来,叫做从 n个不同元素中取出 m 个元素的一个排列.当 ...

  2. SpringMVC重定向传递参数

    在SpringMVC的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到.但是,这样使用的是forward方式,浏览器的地址栏是不变 ...

  3. python爬虫——web前端基础(3)

    超链接的使用------>>>> 链接的引用使用的是<a>标记. <a>标记的基本语法:<a href="链接地址"   ta ...

  4. 洛谷P2194 HXY烧情侣

    题目描述 众所周知,\(HXY\)已经加入了\(FFF\)团.现在她要开始喜\((sang)\)闻\((xin)\)乐\((bing)\)见\((kuang)\)地烧情侣了.这里有\(n\)座电影院, ...

  5. MySQL注释符号

    今天在执行mysql语句时很奇怪为什么没有执行,查询后发现“-- ”是mysql的注释符号,不会执行的  mysql注释符有三种: 1.#... 2."-- ",注意--后面有一个 ...

  6. 黑马学习ajax&json 笔记

    ## 今日内容 1. AJAX: 2. JSON # AJAX: 1. 概念: ASynchronous JavaScript And XML 异步的JavaScript 和 XML 1. 异步和同步 ...

  7. ES6新特性使用小结(一)

    一.let const 命令 'use strict'; /*function test(){ //let a = 1; for(let i=1;i<3;i++){ console.log(i) ...

  8. Luogu P1333 瑞瑞的木棍 并查集&&字符串?

    把每种颜色看成一个点,然后合并去判联通: 若联通,判一下是不是欧拉图或欧拉路... 还有,我的不是正解,要吸氧才能水过去...QAQ // luogu-judger-enable-o2 // luog ...

  9. HDU1854 Q-Sequence

    http://acm.hdu.edu.cn/showproblem.php?pid=1854 随手练习 #include <bits/stdc++.h> using namespace s ...

  10. AtCoder Beginner Contest 071 ABCD

    1001 求个绝对值比较大小喽 1002 把字符串出现的字母记录一下,然后遍历a-z,谁第一个没出现就输出谁 1003 Problem Statement We have N sticks with ...