美文网首页iOS-开发
iOS OC对象内存结构考察

iOS OC对象内存结构考察

作者: Johnny_Z | 来源:发表于2020-10-05 18:15 被阅读0次

今天看到一道有意思的面试题

@interface Sark : NSObject
@property (nonatomic, copy) NSString *name; 
- (void)speak;
@end
@implementation Sark
- (void)speak {
    NSLog(@"my name's %@", self.name); 
}
@end
@implementation ViewController 
- (void)viewDidLoad {
    [super viewDidLoad]; 
    id cls = [Sark class]; 
    void *obj = &cls;
    [(__bridge id)obj speak];
}
@end

问:上面代码会打印什么东西?
what? Are you kidding me?
我们先来看看运行结果

image.png
居然还能真的打印出来。既然结果都告诉你了,我们就来分析一下。

第一点:为什么能调用speak方法?

  • 1、objc我们知道在调用speak的时候被强转成了id类型,
  • 2、obj指向的内存地址的第一个属性是指针类型,并且指向的是[Sark class],其实就是isa指针
  • 3、当OC对象obj调用方法speak,其实是向obj发送消息具体实现其实就是objc_msgSend(obj, @selector(speak)),而isa 指针又指向[Sark class];

经过上面3点分析,我们不难得出obj可以是可以找到speak方法的

第二点:obj指向的内存结构是啥?(speak会输出啥?)

  • 1、clsobj我们知道都是函数内的局部变量,应该在内存的结构中
    image.png
  • 2、[super viewDidLoad];这个是OC对象调用父类的方法,其实现本质是objc_msgSendSuper2函数,而其第一个参数类型是struct objc_super *;他会隐式的创建一个objc_super结构所以这段代码的大意可以表示为如下
struct objc_super arg = {
        self,
        objc_getClass("ViewController")
    };
objc_msgSendSuper2(&arg, sel_registerName("viewDidLoad"));

至此其内存结构可以解析为


image.png

经过以上两点对内存结构的分析我们知道,当我们调用[(__bridge id)obj speak];时会将viewController的实例self打印出来;

总结 :考擦的知识点


  • 1、oc对象的内存结构分布情况
  • 2、函数内的局部变量在栈中的分布情况,这里需要一点汇编知识
  • 3、关键字super在底层的实现原理

相关文章

  • iOS OC对象内存结构考察

    今天看到一道有意思的面试题 问:上面代码会打印什么东西?what? Are you kidding me?我们先来...

  • iOS的内存管理

    iOS OC对象的内存管理 在iOS中,使用引用计数来管理OC对象内存 一个新创建的OC对象引用计数默认是1,当引...

  • OC对象的本质(上)

    iOS | OC对象本质 | Objective-C 什么是OC语言,OC对象、类的本质是什么,OC对象的内存布局...

  • iOS之从MRC到ARC内存管理详解

    概述 在iOS中开发中,我们或多或少都听说过内存管理。iOS的内存管理一般指的是OC对象的内存管理,因为OC对象分...

  • 内存对齐

    知识点概要 OC对象内存对齐结构体内存对齐 OC对象内存对齐 计算内存大小的三种方式 1.sizeof:系统提供的...

  • iOS 内存(系统引用的技术)了解

    iOS程序的内存布局 Tagged Pointer OC对象的内存管理 copy和mutableCopy

  • OC对象内存占用及优化

    结构体内存对齐原理 前言:我们都知道,在iOS开发中,我们写的oc代码,底层都是用c++来实现的,而oc对象本质就...

  • iOS-浅谈OC中对象的类型

    目录 OC对象的类型Instance对象(实例对象)----实例(instance)对象内存结构Class对象(类...

  • 内存管理

    OC对象的内存管理 1、在iOS中,使用引用计数来管理OC对象的内存,一个新创建的OC对象引用计数默认是1,当引用...

  • 内存管理

    OC对象的内存管理 在iOS中,使用引用计数来管理OC对象的内存 一个新创建的OC对象引用计数默认是1,当引用计数...

网友评论

    本文标题:iOS OC对象内存结构考察

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