oc对象模型理解

OC与OD门电路 学过数电模电的同学,应该都听过OC门电路与OD门电路。即使你没听过,那么当年在毕业参加工作面试时,或许会被面试官问到或者考题中考到。因为很多芯片的IO口,其内部就属于OC或者OD门。想起去年,小编在找工作面试时,被面试官提问过此问题,当时那叫一个“惨”啊! 作为一名硬件工程师,虽然在电路设计中,很少遇到这类电路,但是其电路形式以及工作原理还是必须要了解些的。 所以小编还是有必要讲一下OC门与OD门。 OC门 OC门即集电极开路。也就是三极管的集电极什么都不接。当左端输入低电平时,右端的三极管输出为低电平。 阅读详情
首先,OC是一门编程语言,Foundation是一个为OC而生的为了方便程序员使用的编程框架。

这里可以用各司其职来形容它们:
     作为一门面向对象编程语言,OC本身只需要关注自己的对象模型的管理,也就是它只需要管理好OC对象,类,这些东西的组织和联系。
     而作为一个基于OC的框架,Foundation关注的则是让程序员更方便的使用OC语言进行编程。

以上的说明看似是废话,或者说只要是使用OC的程序员都知道的。但是我觉得我没有深刻的理解它,我本身是大三学生,学习的过程中就喜欢深究原理,加上之前鼓捣过半年一年的嵌入式,什么东西都感觉还是弄得清清楚楚,用起来才会踏实,所以翻阅各种帖子研究了一下OC对象模型的实现,在这里总结一下。


从很眼熟的NSString和NSObject开始吧。
     NSString不用说了,字符串类,每天都在用。NSObject这个也熟的不行,我们使用的类基本上都继承自它。然而这里要说的是,严格来说,它们的等级不同,或者说分属不同的范围:NSObject属于OC语言定义的内容,而NSString则是由Foundation框架提供的。
     一个很明显的地方可以看出,NSObject类和我们使用的继承自它的各种类的分别。在Xcode按command + shift + o,分别搜索NSObject.h文件和NSString.h文件可以看到,后者存在于Foundation框架包中,而NSObject.h则user/include下面。
     看一下NSObject的定义可以看到,它本身提供的属性和方法,基本上都是关于对象的分配,初始化,拷贝,内存管理,方法的调用,父类子类的关系等等。

这些就是上面说的,一个编程语言需要操心的点,作为一门面向对象的编程语言,它总要告诉编程者,如何初始化一个对象,如何分配内存,如何拷贝对象等等。OC自己定义了一个根类NSObject,并为根类提供了对象的内存分配,初始化,对象管理,对象模型的实现,使用时只需要继承NSObject类,就可以实现类的定义,对象的初始化,拷贝,销毁,方法调用等功能,这就是OC提供的东西。
     但是OC并不提供字符串的定义,image的定义,文本框的定义,数组和字典等等,这些都是由基于OC的框架提供的,也就是说,OC提供给我们创建,使用,管理类和对象的功能,而字符串,数组这些东西,需要我们使用OC提供的功能来自己实现,Foundation的作用就在此,我们不用再自己写一个继承自NSObject的“string”类,再写一大堆方法来使用字符串,Foundation已经写好了NSString供我们使用,UIKit等其它框架均是如此。

     所以说严格来说,NSObject是OC这门语言提供的类,我们可以继承它来创建自己的类,创建对象,它是一个工具,也是OC这门语言的核心。而对于Foundation可以这么理解:由于编程经常要使用字符串,数组,字典等类型的数据,而OC语言在一开始仅仅提供了NObject这一个根类,每个要使用它的人都需要自己编写继承自它的字符串类和数组类,这非常麻烦并且不合理,所以就有一群人做了这个工作,写好了一大堆常用的类型,每个OC的程序员都使用它来编程,这样就很方便且利于传播了,它就是Foundation。


     讲到这里,就清楚了OC和Foundation的联系,那下面看一下OC的对象模型的实现。

     对于一门面向对象的编程语言,类,对象,方法(也叫函数,OC中叫消息)是核心,OC是怎么组织对象,类,和方法的呢?
     上面说过,每一个类都继承自NSObject类,也就是说,NSObject类如果有成员变量,那么其它的类就都有这个变量,当然是有的,这个成员变量是isa:

     isa的类型是Class,就是说,每一个对象:NSString,NSArray,UILabel等等这些类实例出的变量,里面都包含一个Class类型的isa变量,Class是什么类呢:

     它是一个指针,也就是说isa是一个指向objc_class结构体的指针,即每一个对象中都包含一个objc_class结构体,这个结构体的定义是怎样的呢?

     看到这里可能有点疑惑了,isa本来就是一个指向objc_class的指针,而objc_class结构体中又包含isa指针?很好理解,由于每个对象内部都包含objc_class结构体,所以,这个结构体中的isa指针使用来指向别的对象的,即每个对象都包含一个isa指针,可以用这个指针指向别的对象来建立联系。

     我们知道,使用一个对象的时候,无非就是两点,对象中的实例变量和方法,我们在定义一个类的时候,会定义自己的实例变量和方法,而方法又分为两种,动态方法和静态方法,动态方法是对象方法,静态方法是类方法,那他们分别是怎么联系的呢?
     首先要明确的是,类也是一个对象,对于OC来说一切都是对象,类也有isa指针。
     我们定义了一个新的类,给它添加了一些新的成员变量和类方法,对象方法,然后用这个类实例出了一个对象,我们调用这个对象的对象方法,也可以调用这个类的类方法,然而这个对象在内存中的保存,却只保存了成员变量,并没有保存方法,那对象是怎么执行方法的呢:
     一个对象在内存中的存储可以看成一个结构体,首先,这个结构体中有自己的成员变量,然后还有父类的成员变量,父类的父类的成员变量,这样按照继承链找上去,最终会找到NSObject类,上面说过,NSObject只有一个成员变量就是isa指针,它指向另外一个对象,指向谁呢?对于一个对象来说,它的isa指针,就指向自己的类,比如 NSString *str = [NSString new]; 那这里str对象的isa指针就指向NSString类,当我们向str发送一个对象方法的时候,str就通过自己的isa指针,找到NSString类,再找到这个类中的methodLists,这个列表中就保存了NSString类的所有对象方法,找到并调用就可以了。
     而对于类方法,它是直接被发送给类的,比如[NSString alloc],而NSString类中只保存了对象方法,不保存类方法,这又怎么办呢,前面说过,类也是对象,也有isa指针,那么就通过它的isa指针,找到另外一个类,这个类叫元类<metaclass>,元类保存了类方法列表,找到它就可以调用类方法了。
     元类也是有继承关系的,一子类的元类就继承自父类的元类,当在自己的类中找不到方法时,就向父类寻找,一直找到NSObject,这也就结识了为什么每一个类都可以alloc,new...因为这些是定义在NSObject中的。
     元类也是一个对象,它也有isa指针,所有的元类的isa指针都指向NSObject类的元类,而NSObject元类的isa指针指向自己,下图反映了这个复杂的关系:
     
这样,每个对象在内存中就只保存成员变量和isa指针就可以了,对象方法的实现保存在类中,对象可以通过isa指针调用,类方法保存在元类中,类可以通过isa指针调用,而唯一一个方法实现和自己保存在一起的就是NSObject的元类,它的isa指针指向自己。 
OC中的语法糖(你真的理解了点语法么?) 语法糖是一种大多程序员开发的时候使用的东西,今天我们一起来研究下OC中的语法糖。 阅读详情

相关推荐

【电路设计】三极管的集电极开路OC输出

三极管集电极开路输出情况, OC电路分析

wonderful u 7804

OC内存管理模型

OC三种内存管理模式: 1.       MRC: ManualRetain-Release手动持有释放,OC本身的引用计数alloc/new/copy/mutablecopy release/autorelease。 2.       ARC: Automatic Reference Counting 自动引用计数: Xcode的ProjectSetting中,设置Objective-C

自由理想的足迹 2080

HC?OC?这些校招黑话你看明白了吗?

HC?OC?这些校招黑话你看明白了吗?

悟已往之不谏 知来者之可追 4万+

【iOS】Runtime与对象模型

一. Runtime是什么 Runtime 是一个共享动态库,其目录位于 /usr/include/objc,由一系列的C函数和结构体构成。和 Runtime 系统发生交互的方式有三种,一般都是用前两种∶ 使用OC源码 直接使用上层OC源码,底层会通过 Runtime 为其提供运行支持,上层不需要关 /心 Runtime 运行。 NS0bject 在OC代码中绝大多数的类都是继承自 NSObject 的, NSProxy 类例外。 Runtime 在 NS0bject 中定义了一些基础操作, NSObje

BestpayTech的博客 263

【Rcode】生存分析: KM & COX回归& 随机森林& nomogram

本文使用了R——survival包下的lung数据进行方法测试: 1)KM 2) Cox回归:多因素 3)随机森林因子(根据cox回归结果) 4)nomogram ( 根据cox回归结果,建立了中位生存时间,1年5年生存率的概率计算) -------------------????????‍♀️本文只有干货,非常干!????----------------------------- 一、数据加载 #生存分析 library("survival") library("survminer") data("

weixin_43172152的博客 9273

从代码到实践:手把手教你用EmbodiedOcc++实现高效3D占用预测(含ScanNet配置)

本文提供了EmbodiedOcc++框架在ScanNet数据集上实现高效3D占用预测的完整实践指南。从环境搭建、数据预处理入手,详细解析了其核心创新点——几何引导优化(GRM)与语义感知不确定性采样(SUS)的代码实现与配置,并分享了训练、评估及调参的实战技巧,帮助开发者快速掌握这一先进的3D感知技术。

terraform7cloud的博客 588

[iOS开发]Objective-C对象模型

本章主要介绍Objective-C对象模型的实现细节,以及Objective-C语言对象模型中对isa swizzling和method swizzling的支持。

weixin_52192405的博客 873

如何加载交易策略EA到MT4/MT5

1、打开MT4/MT5软件 2、首先,必须有一个EA,而且必须是mq4/ex4为扩展名。点击左上角“文件”—“打开数据文件夹”,找到安装路径 3、将EA的ex4或mq4文件放到MT4目录\MQL4\Experts里面(本文以名为Demo的EA为例) 4、如果有DLL库文件,复制到experts目录下的libraries子目录中 5、如果有tpl模板文件,复制到templates目录中 6、添加完成后重启MT4,点击允许EA运行图标 7、在导航中找到刚才安装的EA,拖拽到...

weixin_41364817的博客 7359

OC对象的分类

OC对象主要可以分为三种 instance对象 实例对象 class对象 类对象 meta-class对象 元类对象 instance对象 instance对象就是通过类alloc出来的对象 每次调用alloc都会产生新的instance对象 NSObject *obj1 = [[NSObject alloc] init]; NSObject *obj2 = [[NSObject alloc] init]; obj1 obj2是NSObject的的instance对象 它们是不同的两个对象 分别占据

qq_45824823的博客 260

【KBrowser】基于 Kiwi/chromium 制作全新外壳,将 chromium 代码当作 webview 使用,实现可控核替换

chromium 其实只需几步巧妙的架构,就能拿来“换核”,甚至可以插件化,实现类似webview.apk 的效果。重新设计界面,不再是差不多的回声。而 Kiwi 基于 chrome 77 ,只有 50 MB。优势是兼容好、可安装扩展。

sinat_27171121的博客 2028

合肥工业大学操作系统实验8

依据操作系统课程所介绍的地址映射与内存共享的原理,本实验的目的是深入理解物理内存的分页管理方式。 深入理解操作系统的段、页式内存管理。包括理解段表、二级页表,以及逻辑地址、线性地址、 物理地址的映射过程。编程实现段、页式内存管理上的内存共享,从而深入理解操作系统的内存管理。从而加深对教材上地址映射与内存共享的理解。

Martin-share的博客 1721

OC-对象

OC-对象OC中创建对象 创建OC对象需要两个步骤: 分配和初始化 最后会返回指向完成对象的指针 OC中创建对象有两种方法: [[Person alloc] init] //在创建对象时,这两部一般合成在一块, 以防止alloc分配不成功,而初识化类野指针 [Person new] //就是合并了上面的两步, 当时在初始化时并不能传递参数 allloc

motionEnabled 851

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 178

一文搞懂OC门、OD门及其作用

OC门、OD门、OC门的作用

csdn10626的博客 5万+

RK3588开发笔记-Hailo AI模块调试

本文详细介绍了在RK3588开发板上调试HailoAI模块的全过程。首先概述了RK3588处理器的强大性能(4核A76+4核A55,6TOPS算力)和Hailo-8 AI加速模块的特点,重点阐述了通过PCIe接口连接两者的硬件方案。调试步骤包括:确认内核PCIe配置、编译Hailo驱动、下载固件文件并部署到指定目录,最后通过运行resnet模型验证模块性能(实测FPS达2456)。文中提供了完整的软件包下载地址和GitHub源码链接,为开发者实现类似AI加速方案提供了实用参考。

flypig has a dream! 963

SAP 管道业务(Pipeline Procurement)是用于水、电、气等不间断供应且无库存管理的物料采购场景,核心是消耗即记账、无库存持有,通过 MM-FI 集成实现实时负债与成本过账

摘要:SAP管道业务适用于水电气等无库存管理的物料采购场景,通过消耗即记账机制实现实时负债与成本过账。核心配置包括创建PIPE物料类型(无库存管理)、维护管道采购信息记录、配置自动记账科目等。SAP PO可集成外部系统实现流程自动化,如自动过账提取数据、发票校验等。实施要点在于物料主数据、信息记录和科目确定的精准配置,以及PO接口的可靠对接,最终构建端到端的高效采购与财务结算体系。

金牌架构师 748

输出比较(OC)和PWM的原理和理解

理解PWM原理,理解OC原理,并且初步知晓他们是如何配合工作的。

qq_74083494的博客 2925

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

oc怎么添加win引导_OC透明贴图

写在前面透明贴图在C4D中经常会用到,比如在物体上贴个图形,如下图所示,这个在默认渲染器中操作比较简单,切换到OC中,有的小伙伴会有些懵圈,所以写了这篇文章(使用OC3.07),希望对大家有所帮助,笔芯。OC中实现透明贴图,涉及到图像纹理节点,下面先梳理相关的知识。OC节点编辑器OC中一个个节点可以看成一个个暗盒,它有两类端口,左侧输入端:输入指令,右侧输出端:输出结果,输入端可有多...

weixin_39834488的博客 2820

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OC对象模型细节

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34349320的博客 136

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c++ 、java 、 oc 对象模型比较(干货)

最近突然想起对oc的对象模型比较清楚,那么c++、java怎样实现的呢? 参考文献: http://www.cnblogs.com/skynet/p/3343726.html  吴秦(Tyler)c++对象模型 1.  先来易理解的,泛型的实现? c++的泛型,采用编译期处理,添加对应的函数名+参数名,运行期直接调用; java 泛型,是伪泛型,采用编译器类型检查等,实际加载cl

nothingl3的专栏 1371

OC简介

前奏: 在学习OC语法前我们先来了解一下一些简单Unix指令: u ls –l          列出当前目录下的所有内容(文件\文件夹) u pwd          显示出当前目录的名称 u cd             改变当前操作的目录 u who          显示当前用户名 u clear         清屏 u mkdir        新建一个目录 u tou

ZhuanShenDeGuDu的专栏 815

Open Catalyst Project完全攻略:OC20/OC22/OC25技术演进与实战选择指南

你是否正在催化剂机器学习研究中为数据集选择而苦恼?面对Open Catalyst Project推出的OC20、OC22和OC25三个版本,不知道哪个最适合你的研究需求?本文将带你深入解析这三个数据集的技术演进路线、核心特性差异和实战应用场景,帮助你做出明智的选择决策。 ## 从实验室到工业应用:数据集的演进路线 Open Catalyst Project的数据集发展呈现出一条清晰的技术演进路

gitblog_00072的博客 1104

Open Catalyst数据集技术演进与选择指南:OC20/OC22/OC25深度解析

在催化剂机器学习研究领域,数据资源的选择直接影响模型性能和研究成果。Open Catalyst Project的OC20、OC22和OC25数据集为不同层次的研究者提供了丰富的选择方案。本文将从技术演进路线、核心参数对比、应用场景匹配三个维度,为技术研究者和工程师提供全面的数据集选择指导。 ## 数据集技术演进路线分析 ### 基础奠基期:OC20的技术突破 OC20作为系列首版数据集,于20

gitblog_00770的博客 1032

OC菜鸟成长记-OC中的数组创建和操作

在OC中,数组分为两种:不可变数组(NSArray) 和 可变数组(NSMutableArray)。根据自己的认识,笔者在下面对OC中的数组进行一下总结。 首先是不可变数组(NSArray): // NSArray //初始化 NSArray *array =[[NSArray alloc]init]; NSArray *array

LiuYongM的博客 1683

催化剂机器学习数据集技术演进:从OC20到OC25的革命性跨越

Open Catalyst Project(OCP)的催化剂机器学习数据集技术正引领着催化科学的数字化革命。从2020年推出的OC20到2025年最新发布的OC25,这一系列数据集不仅推动了催化领域的研究进展,更为人工智能在材料科学中的应用提供了坚实基础。本文将深入探讨这一技术演进历程,揭示从OC20到OC25的跨越式发展。 ## OC20:催化剂机器学习的奠基之作 2020年发布的OC20(

gitblog_00389的博客 683

OC的本质

1.OC的本质是什么? OC的对象和类是基于C/C++的结构体来实现的。OC的代码转换过程如下: OC->C/C++ ->汇编语言 -> 机器语言。 2.如何查看OC的代码转成了C/C++的代码呢? 例如创建了一个工程,名字为OC-01,编写代码如下: @interface Student : NSObject @end @implementation Stude...

lyz0925的博客 468
上一篇: UITableView的上下滑动与自己添加的手势冲突
下一篇: swift中数组元素类型问题
Make___
博客等级 码龄12年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值