OC底层探索(一):alloc & init背后的秘密
2023-12-29 04:35:19
前言
作为一名 iOS 开发者,我们对 alloc 方法一定不陌生,它被广泛用于初始化对象。然而,alloc 方法是如何实现对象初始化的,其背后又隐藏着哪些奥秘?本文将深入探索 OC 底层,带你揭开 alloc 和 init 的神秘面纱。
alloc 方法的本质
alloc 方法是 Objective-C 中负责分配对象内存空间的方法。当我们调用 alloc 方法时,系统将为该对象分配一块内存区域,并返回一个指向该区域的指针。需要注意的是,此时对象尚未被初始化,其内部成员变量仍为默认值。
NSObject *object = [NSObject alloc];
init 方法的作用
init 方法是用来初始化对象的。当我们调用 init 方法时,系统将执行对象的初始化过程,包括设置对象的成员变量、调用父类的初始化方法等。init 方法会返回一个指向初始化后对象的指针,该对象可以在此后被正常使用。
NSObject *object = [[NSObject alloc] init];
alloc 和 init 的组合使用
在实际开发中,我们通常会组合使用 alloc 和 init 方法来创建对象。这是因为:
- alloc 方法仅负责分配内存,不执行初始化过程。
- init 方法需要一个指向已分配内存的指针作为参数,才能执行初始化过程。
因此,我们通常会先调用 alloc 方法分配内存,再调用 init 方法进行初始化。
底层实现原理
在底层,alloc 方法和 init 方法是由运行时系统实现的。当我们调用 alloc 方法时,系统会调用 objc_allocateClassPair 函数创建一个新的类,该类继承自 NSObject 类。随后,系统会调用 objc_allocateInstance 函数分配一个指定大小的内存块,并将其作为该类的一个实例返回。
init 方法的实现过程更为复杂。当我们调用 init 方法时,系统会根据对象的类信息,找到该类中实现的 init 方法,并调用该方法。init 方法通常会执行以下步骤:
- 设置对象的成员变量为默认值。
- 调用父类的 init 方法,以便父类的成员变量也被正确初始化。
- 执行额外的初始化代码,例如为对象分配其他资源等。
总结
通过本文的深入探讨,我们对 alloc 和 init 方法有了更深入的理解。我们了解到,alloc 方法负责分配对象内存,而 init 方法负责初始化对象。在实际开发中,我们通常会组合使用这两个方法来创建对象。掌握 alloc 和 init 的底层原理,有助于我们更好地理解 Objective-C 的内存管理机制,并写出更加健壮和高效的代码。