美文网首页
runtime-内存访问相关

runtime-内存访问相关

作者: Berning | 来源:发表于2021-09-16 16:08 被阅读0次

示例

#import "NSPerson.h"


@interface NSWorker : NSPerson

@property NSString *name;

- (void)print;

@end

#import "NSWorker.h"

@implementation NSWorker

- (void)person
{
    [super person];

    id cls = [self class];
    void *obj = &cls;
    [(__bridge id)obj print];
    
}

#import "NSWorker.h"

int main()
{
        [[NSWorker new] person];
}

//log
2020-08-28 20:10:31.537720+0800 runtime[9289:160822] my name is <NSWorker: 0x10071f120>
Program ended with exit code: 0

图示

示意图

分析1

对比上图两种方法调用方式,可以看出:
1>通过obj调用print: 是直接找到NSWorker类,然后调用print
2>通过worker调用print: 是通过worker对象内部的isa&isa_mask找到NSWorker类,然后调用print

结论,可以调用成功

分析2

两种方式的区别
1>obj调用print:局部变量obj与cls在函数栈空间是连续的,即局部变量obj与cls(NSWorker)内部isa内存地址是连续的
2>worker调用print:局部变量worker与函数栈空间其他局部变量是 连续的,worker 调用print是通过worker内部isa & isa_mask找到NSWorker类(isa),所以worker与NSWorker内部的isa的内存地址是不连续的

结论:print内部访问结构体NSWorker_IMPL的name成员,是访问其isa后面的8个字节
1>obj调用print:因为obj直接指向了cls = NSWorker_IMPL(isa),所以相当于访问cls后面8个字节,name的值是pls前面的那个局部变量的值
2>worker调用print:因为worker是间接指向NSWorker_IMPL,所以访问的8个字节的值不会是函数栈空间的其他局部变量

分析3

为什么输出结果是my name is <NSWorker: 0x10071f120>

- (void)person
{
    [super person];

    id cls = [self class];
    void *obj = &cls;
    [(__bridge id)obj print];
    
}

通过分析1和分析2
person方法内部的局部变量有:

obj 
cls
objc_super  objc_s = {self , [self class]};

上面三个地址由低到高,而obj = cls->isa,所以后面8个字节是objc_s的前8个字节,即self(当前对象)

相关文章

  • runtime-内存访问相关

    示例 图示 分析1 对比上图两种方法调用方式,可以看出:1>通过obj调用print: 是直接找到NSWor...

  • JVM(七)内存与垃圾回收|对象的实例化内存布局与访问定位+直接

    本文主要讲对象相关(对象实例化、内存布局、访问定位)和直接内存相关的内容。 目录 1 对象的实例化内存布局与访问定...

  • Runtime-原理

    runtime初探对象与方法的本质runtime-消息发送runtime-动态方法解析runtime-消息转发 r...

  • Swift Runtime-引用计数

    前言 在Swift Runtime-初探一文里,我们初步研究了对象的内存结构.有metadata及Refcount...

  • iOS 内存相关的基础知识

    为什么不能直接访问物理内存? 内存不够用。 内存数据不安全。 内存管理方案 相关知识点[https://jueji...

  • Runtime-内存模型

    Runtime 是 iOS编程人员的核心基础知识,Objc Runtime使得C具有了面向对象能力,在程序运行时创...

  • runtime-整理中

    runtime-整理中

  • 十八、内存访问冲突、指针

    内存访问冲突(Conflicting Access to Memory) 产生内存访问冲突的条件 内存访问冲突会在...

  • runtime-闲聊内存管理

    前言 ARC作为一个老生常谈的话题,基本被网上的各种博客说尽了。但是前段时间朋友通过某些手段对YYModel进行了...

  • 面试UI相关

    UI相关 1. UI视图数据源同步 并发访问,数据同步 (内存消耗 ) 串行访问(子线程耗时,会有延时) 2. 事...

网友评论

      本文标题:runtime-内存访问相关

      本文链接:https://www.haomeiwen.com/subject/cuwlsktx.html