在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