(转发)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());
}
运行效果:
http://blog.csdn.net/zfpp25_/article/details/9496705
http://blog.csdn.net/zfpp25_/article/details/9497187
http://blog.csdn.net/zfpp25_/article/details/9497721
http://blog.csdn.net/zfpp25_/article/details/9498233
(转发)IOS高级开发~Runtime(四)的更多相关文章
- (转发)IOS高级开发~Runtime(三)
11.系统类的方法实现部分替换 - (void) methodExchange { Method m1 = class_getInstanceMethod([NSStringclass],@selec ...
- (转发)IOS高级开发~Runtime(二)
一些公用类: @interface ClassCustomClass :NSObject{ NSString *varTest1; NSString *varTest2; NSString *varT ...
- (转发)IOS高级开发~Runtime(一)
IOS高级开发-Runtime(一) IOS高级开发-Runtime(二) IOS高级开发-Runtime(三) IOS高级开发-Runtime(四) 一些公用类: @interface Custom ...
- IOS高级开发 runtime(一)
一. 简介 IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度.要想使用runtime,首先要引入系统的头文件. <span style="font-size:18p ...
- iOS 高级开发 runtime(三)
三 .动态添加方法 我们可以通过runtime动态地添加方法.那么到底啥叫动态添加方法呢?动态添加方法就是当我们程序运行时才知道我们应该调用哪个方法.我们首先需要了解这一点,当我们编写完一段代码后,我 ...
- IOS 高级开发 runtime(二)
二.移魂大法 使用runtime还可以交换两个函数.先贴上代码和执行结果. #import <Foundation/Foundation.h> @interface DZLPerson : ...
- IOS高级开发之多线程(四)NSOperation
1.什么是NSOperation,NSOperationQueue? NSOperation是一个抽象的基类,表示一个独立的计算单元,可以为子类提供有用且线程安全的建立状态,优先级,依赖和取消等操作. ...
- ios蓝牙开发(四)app作为外设被连接的实现-转发
代码下载: 原博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo. 再上一节说了app作为central连接periphera ...
- IOS高级开发~Runtime(一)
#import <Foundation/Foundation.h> @interface CustomClass : NSObject -(void)fun1; @end @interfa ...
随机推荐
- Java:创建线程
Java定义了两种创建线程的方法: 1.实现Runnable接口 要实现Runnable接口,只需简单地实现run()方法即可,声明如下:public void run() 在run()方法中,可以定 ...
- C.One Piece
链接:https://ac.nowcoder.com/acm/contest/908/C 题意: Luffy once saw a particularly delicious food, but h ...
- Linux (Windows Linux子系统)
Linux (Windows Linux子系统) 如果想体验Linux环境下开发和运行.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种 ...
- #1369 : 网络流一·Ford-Fulkerson算法 模板题
http://hihocoder.com/problemset/problem/1369?sid=1108721 别人都说先学网络流再学二分图,但是我先学了二分图的,感觉网络流好高端啊. 首先对于原图 ...
- 机器学习框架ML.NET学习笔记【6】TensorFlow图片分类
一.概述 通过之前两篇文章的学习,我们应该已经了解了多元分类的工作原理,图片的分类其流程和之前完全一致,其中最核心的问题就是特征的提取,只要完成特征提取,分类算法就很好处理了,具体流程如下: 之前介绍 ...
- 查询获取所有数据库名及数据库中表的集合、数据库连接字符串(类生成器,暂时支持mysql,sql server,后期有oracle再更新)
现所在公司做项目开发时,经常会自己创建model类,网上的生成器也很多,完全满足自己的不太现实,所以感觉自己做一个更有底气,主要针对过程中的一些语句进行整理,也供其他人学习参考. 连接字符串: mys ...
- 【Java】 hashcode()和System.identityHashCode()
hashcode()和System.identityHashCode() openjdk8: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f ...
- 如何在CSS中解决长英文单词的页面显示问题?CSS3
简言 在页面排版中,经常遇到长英文单词溢出段落容器的情况,如何解决该问题?现编制如下对比演示程序: 演示程序 42du.cn-在线演示程序 部分html代码 <div class="b ...
- iOS VIPER架构(一)
洋葱模型 洋葱模型,是从冰山模型上演变而来的,用来进行层次分析的模型,这是Redux的洋葱模型. action从最外层传入,层层传递直至核心后,经过逐层事件触发,再次被分发出来,执行后续操作. 洋葱模 ...
- 【转】Java Cipher类 DES算法(加密与解密)
Java Cipher类 DES算法(加密与解密) 1.加密解密类 import java.security.*; import javax.crypto.*; import java.io.*; / ...