ios - objective-c runtime之随笔
今天身体不舒服,还顶着写这篇博客。
举个例子,我们之前在写objective-c代码时,经常用到id这个关键字。那 id 究竟是什么?在objective-c的运行时,这样描述的,它其实是一个结构体(struct)objc_object。
struct objc_object {
Class isa;
};
Class究竟是什么呢?其实它也是一个结构体,定义为如下:typedef struct objc_class *Class。
再如我们经常用到SEL关键字,那它究竟是什么呢?
typedef struct objc_selector *SEL;
A method selector is a C string that has been registered (or “mapped“) with the Objective-C runtime。意思是说一个方法的选择器是一个C的字符串(在objective-c运行时注册)。
平时,我们经常定义很多方法,调用很多方法。那方法的定义是什么?
typedef struct objc_method *Method;
在objective-c中,有些比较奇葩的关键字很容易跟C的关键字混淆。如 BOOL 关键字。它的定义如下:typedef signed char BOOL;噢,竟然是一个不带符号的字符。那 YES 和 NO 又是什么呢? 一看很无语,
#define YES (BOOL)1
#define NO (BOOL)0
objective - c 里,还有2个奇葩的关键字 nil 和 Nil。估计没几个人能够回答出这2个关键字的区别。先看看他们的定义吧。
#define nil __DARWIN_NULL
#define Nil __DARWIN_NULL
从定义上看没有区别,但位置上却有区别。 nil 定义在 MacType.h, 代表是实例是空的。 Nil 定义在 objc/objc.h, 代表是空类。
我们在写objc代码时,免不了要定义很多属性。那属性在objc里面的定义是怎么样的?typedef struct objc_property *objc_property_t;
它也是一个结构体...那我们经常使用的retain,weak等关键字会是什么?会是一个结构体吗?答案:NO!它是一个枚举类型。
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
看到很无语.
那super又是什么呢?
struct objc_super
{
id receiver;
Class class;
};
结构体嵌套.... 我还有一个疑问,这么庞大的API,它靠什么样的机制区分开来。
我认真瞄了一下,它应该是有个版本号来管理的。因为它有class_getVersion和class_setVersion.
objc的函数调用实质是消息分发。
在runtime,有2个API可以实现, 一个是 objc_msgSend (给一个类的实例发送信息),一个是objc_msgSendSuper (给它的超类发送一个信息)。
今天先写这么多,后回分解!
ios - objective-c runtime之随笔的更多相关文章
- iOS运行时Runtime浅析
运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@select ...
- IOS开发官方文档随笔
马上着手开发IOS应用程序 创建第一个单视图应用 ###main 方法 int main(int argc, char * argv[]) { @autoreleasepool { return UI ...
- iOS运行时 -- Runtime(摘抄自网络)
运行时(iOS) 一.什么是运行时(Runtime)? 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼.开发中经常用到的底层技术) 二.运行时的作用? 能获得某个类的所有成员变量 能获得某个 ...
- iOS开发之runtime运行时机制
最近参加三次面试都有被问到runtime,因为不太懂runtime我就只能支支吾吾的说点零碎.我真的好几次努力想看一看runtime的知识,因为知道理解它对理解OC代码内部变化有一定帮助,不过真心觉得 ...
- IOS高级开发 runtime(一)
一. 简介 IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度.要想使用runtime,首先要引入系统的头文件. <span style="font-size:18p ...
- iOS学习之Runtime(一)
一.Runtime简介 因为Objective-C是一门动态语言,所以它总是想办法把一些决定性工作从编译链接推迟到运行时,也就是说只有编译器是不够的,还需要一个运行时系统(runtime system ...
- iOS学习之Runtime(二)
前面已经介绍了Runtime系统的概念.作用.部分技术点和应用场景,这篇将会继续学习Runtime的其他知识. 一.Runtime技术点之类/对象的关联对象 关联对象不是为类/对象添加属性或者成员变量 ...
- iOS:学习runtime的理解和心得 (转)
Runtime是想要做好iOS开发,或者说是真正的深刻的掌握OC这门语言所必需理解的东西.最近在学习Runtime,有自己的一些心得,整理如下, 一为 查阅方便 二为 或许能给他人一些启发, 三为 希 ...
- iOS - 回顾总结Runtime原理及使用
runtime简介 因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时.也就是说只有编译器是不够的,还需要一个运行时系统 (runtime system) 来执行编译后的 ...
随机推荐
- 简单OS(ucos超级精简版)——裸调度器【worldsing笔记】
简单原则少ROM,少RAM,任务完成就让出CPU,调度器描述: 1.按最大任务数轮番调度: 2.任务调用延时接口将让出CPU使用权,进入下一个任务调度: 3.用户任务都处于延时或是不使用CPU运行Id ...
- mybatis的辅助类
package org.ssi.util; import java.io.InputStream; import org.apache.ibatis.session.SqlSession; impor ...
- ECshop数据库的访问统计和管理员日志的清空
ECshop是个不错的系统,但是它有一定漏洞,若是访问量巨大的话,大量的访问统计代码会存入数据库的ecs_stats表中,甚至几天就可以达到几百兆,严重的网站直接就崩溃了.数据备份的时候也有很多不便, ...
- 日志文件C++ 时间 文件 行数
#include <stdio.h> #include<windows.h> #include <time.h> #define Line __LINE__ #de ...
- 【Android开发】完美解决Android完全退出程序
背景:假说有两个Activity, Activity1和Activity2, 1跳转到2,如果要在2退出程序,一般网上比较常见的说法是用 System.exit(0) 或是 android.os.Pr ...
- iOS UIView 基本属性用法
.创建UIView UIView * redView = [[UIView alloc] initWithFrame:CGRectMake(, , , )]; UIView * blueView = ...
- android 带表头,左右两个联动的ListView
package com.rytong.mylist; import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...
- pomelo流程
1.首先第一次会加载master服务器.这个比较特别..他负责启动其他服务器 加载master组件和monitor组件..然后执行所有组件的start.. master组件有自己的ConsoleSer ...
- QSqlQueryModel的实例操作
QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作. 我们新建Qt4 Gui Application工程,我这里工程名为queryMode ...
- iOS 符号表恢复 & 逆向支付宝
推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertVie ...