首先创建一个对象
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

- 那么问题来了
- alloc 做了什么?
- init 做了什么?
- 上面的打印说明了什么?
- 废话不多说,直接上图,看图说话

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

一个对象或属性的大小为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;

- 这篇文章写的很详细 从源码看objc对象是如何产生的
网友评论