iOS-Objective-C

alloc init、allocWithZone

2017-09-22  本文已影响16人  追沐

前言

当我们创建一个OC对象的时候,一般是alloc init。alloc分配了对象的内存地址,init对对象就行了初始化。那么系统是在哪里分配给对象内存地址的呢?

要点

当我们alloc的时候系统会分配内存空间(地址)给OC对象,当init的时候实现了对象的初始化工作。就完成了一个对象的创建过程。

+ (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead");

这个方法是NSObject的一个方法,也就是说只要是个OC对象,都会有该方法。创建对象其实也就是创建了一个类型的指针,只要是个指针,创建的时候就会给分配个内存地址,不然这个指针有什么用呢。

验证

为了更加清楚的认识我们写一个测试的类来验证一下:

#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方法。是这样吗?

答案是肯定的,这里有关于单例的创建原理

上一篇 下一篇

猜你喜欢

热点阅读