美文网首页
alloc & init 探索

alloc & init 探索

作者: 跳跳龙_666 | 来源:发表于2020-09-07 17:06 被阅读0次

首先创建一个对象

    MyGirlFriend *p1 = [MyGirlFriend alloc];
    MyGirlFriend*p2 = [p1 init];
    MyGirlFriend*p3 = [p1 init];
    LGNSLog(@"%@ - %p - %p",p1,p1,&p1);
    LGNSLog(@"%@ - %p - %p",p2,p2,&p2);
    LGNSLog(@"%@ - %p - %p",p3,p3,&p3);
  • p1,p2,p3 打印结果结果
<MyGirlFriend: 0x600000b745b0> - 0x600000b745b0 - 0x7ffee2bfd218
<MyGirlFriend: 0x600000b745b0> - 0x600000b745b0 - 0x7ffee2bfd210
<MyGirlFriend: 0x600000b745b0> - 0x600000b745b0 - 0x7ffee2bfd208
打印*p1.png
  • 那么问题来了
  1. alloc 做了什么?
  2. init 做了什么?
  3. 上面的打印说明了什么?
  • 废话不多说,直接上图,看图说话
开辟内存空间.png

总结

  • alloc的作用,MyGirlFriend向系统申请内存空间,得到一个地址指针,用*p1去接收.
  • p2,p3 init, MyGirlFriend没有开辟新的内存空间,都是指向原MyGirlFriend开辟的内存地址.说明 init 没有对原来的内存空间做任何处理.
  • p1,p2,p3 内存地址是不相同的,但是是连续的8字节.指向的是同一片内存空间
  • 接着疑问
    1. alloc是怎么开辟内存空间的?
    2. 要开辟多少内存空间?
    3. 栈内存为什么是连续的,为什么是连续的8字节?
alloc 流程图.png

一个对象或属性的大小为8字节,以前为8字节对齐,现在统一为16字节对齐
16字节对齐算法, 该算法结果始终为16的倍数
作用: 方便 I/O 流读取,更加安全

static inline size_t align16(size_t x) {
    return (x + size_t(15)) & ~size_t(15);
}

init 方法 工厂方法,给用户提供扩展入口

+ (id)init {
    return (id)self;
}

- (id)init {
    return _objc_rootInit(self);
}

new 方法 等同于[[MyGirlFriend alloc] init]
不建议直接调用

+ (id)new {
    return [callAlloc(self, false/*checkNil*/) init];
}

影响一个对象的在内存中的大小是由属性决定的
添加3个属性

@interface MyGirlFriend : NSObject

// 影响的因素的 对象: 属性 : 8 + 8 + 8 + 8 = 32
// 内存的布局 属性
// isa
@property (nonatomic,strong) NSString *name;     
@property (nonatomic,strong) NSString *nickName; 
@property (nonatomic) int hobby;

@end
 MyGirlFriend *objc1 = [MyGirlFriend alloc];
 objc1.name      = @"CC";
 objc1.nickName  = @"C";
 objc1.hobby     = 18;
image.png

相关文章

  • alloc init探索

    1、alloc init 首先用alloc生成一个LGPerson对象。在init另外的对象。 输出生成的对象信息...

  • alloc & init 探索

    首先创建一个对象 p1,p2,p3 打印结果结果 那么问题来了 alloc 做了什么?init 做了什么?上面的打...

  • iOS alloc & init 探索

    0x000 从哪里入手? 先看看main函数 0x001 初探? 为什么是 alloc init? alloc i...

  • iOS alloc & init 探索

    初探 1、新建一个Person 类 先思考打印情况 再运行 得到结果为 猜测:1、init 没有对内存进行任何...

  • alloc&init探索

    OC底层原理学习 alloc 初探 首先创建一个继承于NSObject的Person类带着以下几个疑问,查看打印结...

  • alloc&init探索

    main函数的加载流程 1.在int main前面打个断点 然后增加一个_objc_init的符号断点 记得关闭左...

  • alloc与init探索

    知识点概要 引入alloc干了什么?为什么要有init?为什么要有new?直接使用有何缺陷?[NSObject a...

  • alloc&init 探索

    alloc&init 探索 首先要明确alloc做了什么,init做了什么。 上方的p1/p2/p3经打印是一模一...

  • 1.对象原理探究

    alloc 探索 alloc 已经创建了对象 init alloc 实现 原理 源码实现 介绍三种方式 1、下断点...

  • OC底层原理系列文集

    1、对象底层之alloc&init&new源码分析+三种探索方式OC底层原理01-alloc流程探索[https:...

网友评论

      本文标题:alloc & init 探索

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