美文网首页
iOS 面试题(十):一个 Objectiv

iOS 面试题(十):一个 Objectiv

作者: 简_爱SimpleLove | 来源:发表于2017-02-21 10:19 被阅读92次

注:本文摘自唐巧博客,方便以后查阅。请谅解

问题

一个 Objective-C 对象的内存结构是怎样的?

答案

这是一道老题,或许很多人都准备过,其实如果不是被每个公司都考查的话,这道题可以看看候选人对于 iOS 背后底层原理的感兴趣程度。真正对编程感兴趣的同学,都会对这个多少有一些好奇,进而在网上搜索并学习这方面的资料。

以下是本题的简单回答:

如果把类的实例看成一个C语言的结构体(struct),它首先包含的是一个 isa 指针,而类的其它成员变量依次排列在结构体中。排列顺序如下图所示:

为了验证该说法,我们在Xcode中新建一个工程,在main.m中运行如下代码:

#import

@interfaceFather:NSObject{

int_father;

}

@end@implementationFather

@end

@interfaceChild:Father{

int_child;

}

@end

@implementationChild

@end

intmain(intargc,char* argv[])

{

Child * child = [[Child alloc] init];

@autoreleasepool{

// ...

}

}

我们将断点下在@autoreleasepool处,然后在Console中输入p *child,则可以看到Xcode输出如下内容,这与我们上面的说法一致。

(lldb) p *child

(Child) $0 = {

(Father) Father = {

(NSObject) NSObject = {

(Class) isa = Child

}

(int) _father = 0

}

(int) _child = 0

}

因为对象在内存中的排布可以看成一个结构体,该结构体的大小并不能动态变化。所以无法在运行时动态给对象增加成员变量。

注:需要特别说明一下,通过objc_setAssociatedObject和objc_getAssociatedObject方法可以变相地给对象增加成员变量,但由于实现机制不一样,所以并不是真正改变了对象的内存结构。

下一期的问题:对象内存结构中的 isa 指针是用来做什么的,有什么用?

相关文章

  • iOS 面试题(十):一个 Objectiv

    注:本文摘自唐巧博客,方便以后查阅。请谅解 问题 一个 Objective-C 对象的内存结构是怎样的? 答案 这...

  • iOS最新面试题汇总(四)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(三)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(一)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(二)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS面试题

    iOS面试题 iOS面试题

  • 2019-06-06

    iOS高级面试题 如何面试iOS工程师 一个渣硕iOS春招总结 请你出一套iOS面试题 压倒程序员的最后一个面试题...

  • iOS Runtime

    简书内容都是个人的知识点整理和笔记。 iOS Runtime理解是我们每一个iOS开发者在深刻掌握Objectiv...

  • iOS 面试题及答案

    面试题集锦 iOS面试题及答案1iOS面试题及答案2iOS进阶面试题及答案3 一. CoreAnimation 相...

  • iOS面试题分享——附BAT常见的iOS面试题

    iOS面试题分享——附BAT常见的iOS面试题

网友评论

      本文标题: iOS 面试题(十):一个 Objectiv

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