Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS底层原理--OC对象的本质

iOS底层原理--OC对象的本质

作者头像
谦谦君子修罗刀
发布于 2019-03-22 03:38:49
发布于 2019-03-22 03:38:49
68500
代码可运行
举报
运行总次数:0
代码可运行

哇哦~距离上次更新笔记已是long long age 唔~ 为了颜值与技术在线,坚持写笔记,坚持瘦回两位数(emm…貌似暴露了什么)

算春长不老,人愁春老,愁只是,人间有.png

1、NSObject的本质是什么?

分析: OC代码的底层实现实质是C/C++代码,继而编译成汇编代码,最终变成机器语言。 打开终端,进入main.m所在的文件夹,通过clang rewirte-objc main.m -o main.cppxcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp 代码,生成cpp文件。 在cpp文件中找到如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct NSObject_IMPL {
    Class isa;
}

NSObject的底层实现实质是一个结构体。而结构体中的成员isa是Class类型,通过源码typedef struct objc_class *Class可知它是一个指针。在64为环境下指针占8个字节,而在32位机下是占4个字节。因此该结构体占8个字节(因为该结构体只有一个成员)。

2、NSObject对象占多少内存?

分析: 通过打印

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSObject *obj = [[NSObject alloc]init];
NSLog(@"%zd",malloc_size((__bridge const void *)obj));

可知NSObject对象占16个字节。 那么与题1所述结构体中占8个字节是否冲突? 通过打印NSLog(@"%zd",class_getInstanceSize([NSObject class]))获取NSObject类的实例对象的成员变量所占用的(内存对齐之后)大小,显示确实为8个字节。 在objc的源码中找到class_getInstanceSize方法,发现它返回的是cls->alignedInstanceSize(),对它的描述为Class's ivar size rounded up to a pointer-size boundary意指返回成员变量占据的大小。因此创建一个NSObject对象需要分配16个字节,只是真正利用的只有8个字节,即isa这个成员的大小。 事实上,查看allocWithZone的源码发现它最底层的创建实例的方法实际上是调用了C语言的calloc方法,在该方法中,规定若分配的字节不满16将把它分配为16个字节。

3、若一个Student类继承自NSObject类,那么Student类的对象占多少内存?

分析: 新建Student类,添加成员变量。通过clang反编译,打开cpp文件找到Student类的底层实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Student IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    // 还有Student类的成员变量
    //……
}

从这段代码可以看出,若一个类继承自另一个类,则它的底层会将父类的成员变量放在结构体的最前面,此后依次放置本类的成员变量。而从之前的分析可知,NSObject_IMPL的本质就是一个装有成员变量isa的结构体,因此,Student类对象所占的内存为isa的内存8加上Student类成员变量所占的空间。若不满16个字节,会强制分配到16个字节。另,由于<u>内存对齐</u>的规定,结构体的最终大小必须是最大成员的倍数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <malloc/malloc.h>
@interface Student:NSObject{
   @public
    int age;
    int no;
    int address;
    NSString *name;
    NSString *name2;
    
}
@end

@implementation Student

@end


int main(int argc, char * argv[]) {
    @autoreleasepool {
        Student *stu = [[Student alloc]init];
        NSLog(@"%zd",malloc_size((__bridge const void *)stu));
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

打印结果如下图所示:

结果

附:苹果官方开放源码

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AOP 理解
明星都有经纪人,明星最重要的一件事就是唱歌,拍电影,参加综艺,其他事他不用关注,比如唱歌前可能需要和其他人谈合作,还要布置场地,唱歌后还要收钱等等,这些统统交给他对应的经纪人去做。每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。 AOP实现了代理模式。
王小明_HIT
2019/08/14
4010
Spring AOP 和 动态代理技术
古时的风筝
2018/01/08
7590
Spring AOP 和 动态代理技术
JDK动态代理、Cglib动态代理及Spring AOP
Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。
意疏
2024/12/31
2540
JDK动态代理、Cglib动态代理及Spring AOP
Spring | 深入理解面向切面编程(AOP)
分析:在这个过程中,你直接接触的就是中介,就如同现实生活中的样子,你看不到房东,但是你依旧租到了房东的房子通过代理,这就是所谓的代理模式,程序源自于生活,所以学编程的人,一般能够更加抽象的看待生活中发生的事情。
啵啵鱼
2022/11/23
5870
Spring | 深入理解面向切面编程(AOP)
求求你,下次面试别再问我什么是 Spring AOP 和代理了!
我们知道,Spring 中 AOP 是一大核心技术,也是面试中经常会被问到的问题,最近我在网上也看到很多面试题,其中和 Spring AOP 相关的就有不少,这篇文章主要来总结下相关的技术点,希望对大家有用。
Java团长
2019/07/01
5200
Spring AOP是什么?你都拿它做什么?
为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
技术从心
2019/08/07
6340
Spring AOP是什么?你都拿它做什么?
动态代理:1 个经纪人如何代理 N 个明星
为了加深理解我们回顾一下静态代理,定义一个规定行为的明星电影接口 IMovieStar :
张拭心 shixinzhang
2022/05/10
3320
动态代理:1 个经纪人如何代理 N 个明星
Spring AOP是什么?你都拿它做什么?
上一篇文章中,我对Spring源码进行了分析讨论,此处不再赘述,有兴趣的同学可以看看向Spring大佬低头——大量源码流出解析,本文是对上一篇文章的一个补充。回到正题,为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志,权限验证,事务等功能时,只能在在每个对象里引用公共行为,这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
Java团长
2018/08/03
6140
Spring Aop相关详解
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转。 举例来说,在之前的操作中,比方说有一个类,我们想要调用类里面的方法(不是静态方法),就要创建类的对象,使用对象调用方法实现。对于Spring来说,Spring创建对象的过程,不是在代码里面实现的,而是交给Spring来进行配置实现的。 AOP:面向切面编程。
Dream城堡
2020/11/11
3230
Spring AOP(一) AOP基本概念
AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清楚的同学可以自行去了解。
宁在春
2022/10/31
3310
Spring AOP(一) AOP基本概念
Spring aop 的代理机制
Spring aop 是通过代理实现的,代理有静态代理,jdk动态代理和cglib动态代理,代理就像我们生活中的房产中介,你不直接与房主,银行接触,而是通过中介与他们沟通联系。
java达人
2018/10/25
5180
Spring aop 的代理机制
Spring aop 的代理机制
Spring aop 是通过代理实现的,代理有静态代理,jdk动态代理和cglib动态代理,代理就像我们生活中的房产中介,你不直接与房主,银行接触,而是通过中介与他们沟通联系。 代理的结构如图所示:
java达人
2018/01/31
6420
Spring aop 的代理机制
Spring学习笔记(四)——Spring中的AOP
AOP:全称是 Aspect Oriented Programming 即:面向切面编程。 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
不愿意做鱼的小鲸鱼
2022/09/24
3370
Spring学习笔记(四)——Spring中的AOP
Spring AOP 的实现原理
(点击上方公众号,可快速关注) 来源:Listen, listenzhangbin.com/post/2016/09/spring-aop-cglib/ 转自:ImportNew AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Sp
精讲java
2018/07/03
1.1K0
aop动态代理机制有哪些_aop和动态代理的关系
AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。
全栈程序员站长
2022/11/07
4460
原荐Spring AOP是什么?你都拿它做什么?
         对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利。无论你是对的还是错的,都会在这个平台上找到答案。所
我叫刘半仙
2018/04/16
7110
原荐Spring AOP是什么?你都拿它做什么?
spring静态代理、JDK与CGLIB动态代理、AOP+IoC
现在需求发生了变化,要求项目中所有的类在执行方法时输出执行耗时。最直接的办法是修改源代码,如下所示:
Java架构师历程
2018/09/26
5060
spring静态代理、JDK与CGLIB动态代理、AOP+IoC
springaop的原理_javaaop原理
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
全栈程序员站长
2022/09/22
2940
Spring AOP 的实现机制
AOP(Aspect Orient Programming),一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理是编译期实现,动态代理是运行期实现,可想而知前者拥有更好的性能。
田维常
2019/07/16
3050
2023新版Spring6全新讲解-核心内容之AOP
  在学习Spring的AOP之前我们需要补充下设计模式中的代理模式。这块是理解AOP的必备基础内容。
用户4919348
2023/05/28
3270
2023新版Spring6全新讲解-核心内容之AOP
相关推荐
AOP 理解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验