用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. [Xcode 实际操作]六、媒体与动画-(13)使用UIImageView制作帧动画

    目录:[Swift]Xcode实际操作 本文将演示如何将导入的序列图片,转换为帧动画. 在项目导航区打开资源文件夹[Assets.xcassets] [+]->[Import]->选择图片 ...

  2. python2与python3 版本区别

    目录 编码 输入输出 中文 除法 长整形 内置函数map xrange init reduce 字符串类型 dict字典 经典类 新式类 未完待补充 编码 python2默认编码器为ascii码(只支 ...

  3. Django中间件的执行流程

    Django中间件的执行流程. 请求到达中间件之后,先按照正序执行每个注册中间件的process_reques方法,process_request方法返回的值是None,就依次执行, 如果返回的值是H ...

  4. GYM 101933E(记忆化搜索)

    用每个人的血量作为状态去搜索T飞,考虑题解中更好的搜索方式:每种血量有多少个人作为状态.这样会减去很多重复的状态,因为只要乘一下就得到了所有相同情况的和. 虽然我不会算,但是直观感受起来复杂度比较优秀 ...

  5. 安装redis服务器

    安装redis服务器 Windows环境下安装: 第一步:下载压缩包(地址:https://github.com/MicrosoftArchive/redis/releases) 第二步:解压并打开 ...

  6. hadoop分布式存储(2)-hadoop的安装

    总共分三步:1.准备linux环境 租用“云主机”,阿里云,unitedStack等,云主机不受本机性能影响(或者直接安转linux操作系统或者虚拟机也行): PuTTy Configuration ...

  7. Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录

    [翻译] ASP.NET Core 利用 Docker.ElasticSearch.Kibana 来记录日志 原文: Logging with ElasticSearch, Kibana, ASP.N ...

  8. (转)生产环境常见的HTTP状态码列表(老男孩整理)

    生产环境常见的HTTP状态码列表(老男孩整理) 原文:http://blog.51cto.com/oldboy/716294 ##################################### ...

  9. eclipse下 Failed to find an AVD compatible with target 的解决方法

    第一个Android测试环境下的程序出现这个问题: [2012-04-24 13:18:29 - xxxx] ------------------------------ [2012-04-24 13 ...

  10. yum指令之修复

    折腾着搞 openvpn 网站服务器 yum指令 出了点问题 ------------------------------------------------------------ [root@cl ...