美文网首页iOS-Objective-C
alloc init、allocWithZone

alloc init、allocWithZone

作者: 追沐 | 来源:发表于2017-09-22 00:20 被阅读16次

前言

当我们创建一个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方法。是这样吗?

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

相关文章

  • alloc init、allocWithZone

    前言 当我们创建一个OC对象的时候,一般是alloc init。alloc分配了对象的内存地址,init对对象就行...

  • iOS单例模式

    一 alloc和allocWithZone 初始化一个对象的时候,[[Class alloc] init],其实是...

  • 谈ObjC对象的两段构造模式

    两段构造模式是指创建对象需要先调用alloc方法或allocWithZone方法(已废弃),再调用init方法或i...

  • Alloc和AllocWithZone

    1、alloc 和 allocWithZone有什么区别 初始化一个对象的时候,[[Class alloc] in...

  • alloc、allocWithZone、new

    [[Class alloc] init]其实是做了两件事,alloc和init是两个方法,class调用了两个方法...

  • alloc和new的区别

    在NSObject.mm文件中可以找到alloc方法和new方法的实现 alloc参数allocWithZone ...

  • Alloc 和 AllocWithZone区别

    原文地址,此处只为学习 问题起源 一切起源于Apple官方文档里面关于单例(Singleton)的示范代码:Cre...

  • 探索alloc&init&new底层实现

    alloc实现流程 每次创建对象的时候都会写 [[xx alloc] init] ,但是 alloc 和 init...

  • alloc & init

    debug 如何查看 objc_alloc 源码 符号断点(symbolic breakpoint), 输入方法名...

  • alloc init

    alloc, init alloc时 :完成内存分配。 init : 只是返回实例对象(id)。 Person *...

网友评论

    本文标题:alloc init、allocWithZone

    本文链接:https://www.haomeiwen.com/subject/vtkxextx.html