IOS底层面试题 Objective-c(Runtime、Runloop、Block、内存管理、多线程、性能优化等)

1. OC的本质是什么?

  • OC的面向对象是基于C/C++的结构体实现的。

2. 一个NSObject对象占用多少内存?

  • 系统分配了16个字节给NSObject对象。
	//通过malloc_size函数获得,该函数返回的是系统给实例对象分配的内存大小,在64bit环境下,所获得的数值是16个字节的倍数。
	Person *person = [[Person alloc] init];
	NSLog(@"%zu", malloc_size((__bridge const void *)person));
	//可以通过allocWithZone查看源码,会调用calloc(1, size)函数;size_t size = cls->instanceSize(extraBytes);
    size_t instanceSize(size_t extraBytes) {
   
   
        size_t size = alignedInstanceSize() + extraBytes;
        // CF requires all objects be at least 16 bytes.
        if (size < 16) size = 16;
        return size;
    }
  • 但NSObject对象只使用了8个字节的空间。
	//64bit环境下,可以通过class_getInstanceSize函数获得; 
	NSLog(@"%zu", class_getInstanceSize([Person class]));
	//通过class_getInstanceSize检查源码,是通过alignedInstanceSize的内存对齐原理,返回实例对象的成员变量在内存中所占字节的大小;
	// Class's ivar size rounded up to a pointer-size boundary.
    uint32_t alignedInstanceSize() {
   
   
        return word_align(unalignedInstanceSize());
    }

sizeof

  • sizeof既是一个关键字,也是一个运算符(操作符),但它不是函数。它主要用来计算某一个量在当前系统中所需占用的字节数。
	//64bit
	size_t i = sizeof(int);//4个字节
    size_t longInt = sizeof(NSInteger);//8个字节
    NSLog(@"%zu, %zu", i, longInt);

3. 对象的isa指针指向哪里?

  • interface(实例)对象的isa指针指向class对象。
  • class对象的isa指针指向meta-class对象。
  • meta-class对象的isa指针指向基类的meta-class对象。
        // instance对象,实例对象
        NSObject *object1 = [[NSObject alloc] init];
        NSObject *object2 = [[NSObject alloc] init];
        
        // class对象,类对象
        // class方法返回的一直是class对象,类对象
        Class objectClass1 = [object1 class];
        Class objectClass2 = [object2 class];
        Class objectClass3 = object_getClass(object1);
        Class objectClass4 = object_getClass(object2);
        Class objectClass5 = [NSObject class];
        
        // meta-class对象,元类对象
        // 将类对象当做参数传入,获得元类对象
        Class objectMetaClass = object_getClass(objectClass5);

isa详解isa详解

isa详解 – 位域位域
当通过isa指针获取到类或者元类对象在内存中的地址时,isa要进行位运算,才能得到类或者元类在内存中的地址。
inline Class 
objc_object::ISA() 
{
   
   
    assert(!isTaggedPointer()); 
#if SUPPORT_INDEXED_ISA
    if (isa.nonpointer) {
   
   
        uintptr_t slot = isa.indexcls;
        return classForIndex((unsigned)slot);
    }
    return (Class)isa.bits;
#else
	//isa进行位运算:isa & ISA_MASK
    return (Class)(isa.bits & ISA_MASK);
#endif
}

4.对象的superclass指针指向哪里?

  • subclass类对象的superclass指针指向superclass类对象,superclass类对象的superclass指针指向rootclass类对象,rootclass类对象的superclass指针指向nil。
  • subclass元类对象的superclass指针指向superclass元类对象,superclass元类对象的superclass指针指向rootclass元类对象,rootclass元类对象的superclass指针指向rootclass类对象,rootclass类对象的superclass指针指向nil。
    isa和superclass

5. OC类信息存放在哪里?

  • interface(实例) 对象中,存放着类的成员变量的具体值
  • class 类对象中,存放着成员变量,属性,协议,实例方法的信息。
  • meta-class 元类对象,存放着类方法的信息。
OC对象分为:interface(实例)对象,class(类)对象,meta-class(元类)对象。

6. IOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)

  1. 给对象添加KVO监听,
  2. IOS在运行过程中,通过runtime API动态生成该对象的子类(NSKVONotifiying_类名),并且让interface(实例)对象的isa指针,指向这个子类。
  3. 当修改interface (实例)对象的属性时,会调用Foundation的_NSSetxxxValueAndNotifiy函数。
  4. NSSetxxxValueAndNotifiy函数中,会调用willChangeValueForKey, 然后是父类的set方法,再然后是didChangeValueForKey.
  5. didChangeValueForKey中,内部会触发Observer 的监听方法(observeValueForKeyPath: ofObject: cha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值