在iOS的面试中,有一道经典的题目,NSObject对象占内存多少?很多人能回答个大概,但是对于内部的实现或者这道题的升级就有些含糊了,我们今天来升级下这道题目,然后基于此看下底层的源代码是如何实现的
题目
NSObject *obj = [[NSObject alloc] init];
NSLog(@"class_getInstanceSize = %zd", class_getInstanceSize([NSObject class]));
NSLog(@"malloc_size = %zd", malloc_size((__bridge const void *)(obj)));
NSLog(@"sizeOf = %zd", sizeof(obj));
这三行分别打印多少呢?
如果定义一个类,其新增了其他的属性,那么打印是多少呢?
@interface LFFStudent : NSObject
@property (nonatomic, copy) NSString *name;
@end
LFFStudent *s = [LFFStudent new];
NSLog(@"class_getInstanceSize = %zd", class_getInstanceSize([LFFStudent class]));
NSLog(@"malloc_size = %zd", malloc_size((__bridge const void *)(s)));
NSLog(@"sizeOf = %zd", sizeof(s));
答案
我是答案分割线
第一个问题的打印是:
class_getInstanceSize = 8
malloc_size = 16
sizeOf = 8
第二个问题的打印是:
class_getInstanceSize = 16
malloc_size = 16
sizeOf = 8
接下来,我们就分别看下这三个方法的内部实现
class_getInstanceSize
首先找到class_getInstanceSize的定义:
//返回类的实例的大小
/**
* Returns the size of instances of a class.
*
* @param cls A class object.
*
* @return The size in bytes of instances of the class \e cls, or \c 0 if \e cls is \c Nil.
*/
OBJC_EXPORT size_t
class_getInstanceSize(Class _Nullable cls)
OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
//实现方法
size_t class_getInstanceSize(Cla

本文探讨了iOS中NSObject对象内存占用的问题,详细解析了`class_getInstanceSize`和`malloc_size`的内部实现,通过源码分析揭示了内存对齐算法和对象实际大小的计算方式。同时,文中提到了`sizeof`操作符的作用,并指出OC对象内存分配的特性。

713

被折叠的 条评论
为什么被折叠?



