alloc & init 探索

2020-09-07  本文已影响0人  跳跳龙_666

首先创建一个对象

    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);
<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字节.指向的是同一片内存空间
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
上一篇 下一篇

猜你喜欢

热点阅读