前言
当我们创建一个OC对象的时候,一般是alloc init。alloc分配了对象的内存地址,init对对象就行了初始化。那么系统是在哪里分配给对象内存地址的呢?
要点
- 我们都知道初始化一个OC对象是有两个步骤:
1、给对象分配一个内存空间
2、初始化该对象
当我们alloc的时候系统会分配内存空间(地址)给OC对象,当init的时候实现了对象的初始化工作。就完成了一个对象的创建过程。
- 当执行alloc的时候,系统会自动调用分配内存地址的方法:
+ (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
这个方法是NSObject的一个方法,也就是说只要是个OC对象,都会有该方法。创建对象其实也就是创建了一个类型的指针,只要是个指针,创建的时候就会给分配个内存地址,不然这个指针有什么用呢。
- 创建对象的时候先执行alloc然后执行+ (instancetype)allocWithZone:这个方法,然后执行init方法
验证
为了更加清楚的认识我们写一个测试的类来验证一下:
- 创建一个类TestClass,在实现文件中复习了父类方法,打了一些断点,当在别的地方创建TestClass类对象的时候,执行顺序如下,1-2-3-4
#import "TestClass.h"
@implementation TestClass
- (instancetype)init {
if (self = [super init]) {//3
}
return self;//4
}
//重载allocWithZone父类方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static TestClass *testClass = nil;
testClass = [super allocWithZone:zone];//1
return testClass;//2
}
@end
- 每次创建都会分配新的内存地址
创建对象:
TestClass *class1 = [[TestClass alloc] init];
TestClass *class2 = [[TestClass alloc] init];
TestClass *class3 = [[TestClass alloc] init];
NSLog(@"%@ \n %@ \n %@",class1,class2,class3);
打印结果:
<TestClass: 0x6000000038c0>
<TestClass: 0x6000000038d0>
<TestClass: 0x600000003890>
总结
这就是alloc和init的实质,创建OC对象实质是是创建了一个对象类型的指针,分配指针地址,使指针指向自己的内存空间,并在init方法中实现对对象的初始化。
思考
单例是在整个工程当中只有一个该类实例。那么单例就是只分配一次内存地址,也就是说只执行一allocWithZone方法。是这样吗?
答案是肯定的,这里有关于单例的创建原理。
网友评论