iOS 面试题(1):一个 Objective-C 对象的内存结构是怎样的?
2017-02-21 18:00
295 查看
接下来分享的将会是唐老师一系列的iOS面试题,因为之前好几期唐老师都删掉了,说是要出书,所以转载过来,需要的朋友们可以看下,也方便我自己巩固、学习。
转载自:http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=2709545297&idx=1&sn=a391cf9771ed34a211d4d91724bdbaec&chksm=828f0b8fb5f88299f42bde095fb323fe9ed5fa082b19a451535f069b1db550366a35d6c5e8f7&mpshare=1&scene=1&srcid=0221JIeBGylsHuaG1lwvh5Wn#rd
一个 Objective-C 对象的内存结构是怎样的?
这是一道老题,或许很多人都准备过,其实如果不是被每个公司都考查的话,这道题可以看看候选人对于 iOS 背后底层原理的感兴趣程度。真正对编程感兴趣的同学,都会对这个多少有一些好奇,进而在网上搜索并学习这方面的资料。
以下是本题的简单回答:
如果把类的实例看成一个C语言的结构体(struct),它首先包含的是一个 isa 指针,而类的其它成员变量依次排列在结构体中。排列顺序如下图所示:
为了验证该说法,我们在Xcode中新建一个工程,在main.m中运行如下代码:
我们将断点下在
(lldb) p *child
(Child) $0 = {
(Father) Father = {
(NSObject) NSObject = {
(Class) isa = Child
}
(int) _father = 0
}
(int) _child = 0
}因为对象在内存中的排布可以看成一个结构体,该结构体的大小并不能动态变化。所以无法在运行时动态给对象增加成员变量。
注:需要特别说明一下,通过
转载自:http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=2709545297&idx=1&sn=a391cf9771ed34a211d4d91724bdbaec&chksm=828f0b8fb5f88299f42bde095fb323fe9ed5fa082b19a451535f069b1db550366a35d6c5e8f7&mpshare=1&scene=1&srcid=0221JIeBGylsHuaG1lwvh5Wn#rd
问题
一个 Objective-C 对象的内存结构是怎样的?
答案
这是一道老题,或许很多人都准备过,其实如果不是被每个公司都考查的话,这道题可以看看候选人对于 iOS 背后底层原理的感兴趣程度。真正对编程感兴趣的同学,都会对这个多少有一些好奇,进而在网上搜索并学习这方面的资料。以下是本题的简单回答:
如果把类的实例看成一个C语言的结构体(struct),它首先包含的是一个 isa 指针,而类的其它成员变量依次排列在结构体中。排列顺序如下图所示:
为了验证该说法,我们在Xcode中新建一个工程,在main.m中运行如下代码:
#import <UIKit/UIKit.h> @interface Father : NSObject { int _father; } @end@implementation Father @end @interface Child : Father { int _child; } @end @implementation Child @end int main(int argc, 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方法可以变相地给对象增加成员变量,但由于实现机制不一样,所以并不是真正改变了对象的内存结构。
相关文章推荐
- 一个 Objective-C 对象的内存结构是怎样的?
- iOS 面试题(2):对象内存结构中的 isa 指针是用来做什么的?
- ios 中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候
- 面试题:Student s = new Student();在内存中做了哪些事情?即创建一个对象做了哪些事情
- 面试题:Student s = new Student();在内存中做了哪些事情?即创建一个对象做了哪些事情
- 实例化一个对象内存分布结构
- 虚函数的特性--内存结构的研究, 对象有虚表的反而多占内存了(多4字节即一个指针),函数是预告编译在代码区
- 一个Objective-C对象如何进行内存布局?(考虑有父类的情况)
- iOS对象内存结构中的 isa 指针是用来做什么的?
- 面试题-怎样判断一个对象是不是function?
- IOS OBjective-C 内存概念 (2、对象所有权的基本概念和用法)
- iOS:怎样创建一个好的App目录结构
- 对“三层结构”的深入理解——怎样才算是一个符合“三层结构”的Web应用程序?
- 一道微软的面试题:12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球
- delphi中三层结构怎样设计?一个管理软件的应用服务器端需要建多少个Remote Data Module?
- 在预先定义的内存位置构造一个对象
- 再谈带有虚函数的类对象之内存结构
- 有谁能讲讲 一个EXE 文件是怎样被WINDOWS 给执行的,比如它是怎么被加载的,是怎么被装入内存的,CPU是怎么处理的。
- 如何在指定的内存区域 new 一个对象
- 探索Delphi类与对象的内存结构