//
// main.m
// Day02_ 类加载
//
// Created by imac on 2020/9/8.
// Copyright © 2020 imac. All rights reserved.
//
/*
1.内存中的五大区域
栈 存储局部变量
堆。 存储程序员手动申请的字节空间。malloc。calloc realloc函数
BSS段。存储未被初始化的全局变量 静态变量
数据段(常量区) 存储已经被初始化的全局变量 静态变量 常量数据
代码段 存储代码。存储程序的代码
2. 类加载
1 )在创建对象的时候,肯定是需要访问类的
2)声明一个类的指针变量也会访问该类
程序在运行期间,当某个类第一次被访问到,会将这个类会把存储到内存中的代码段区域 这个过程叫做类加载
只有类在第一次被访问的时候才会做类加载
一旦类被加载到代码段以后,只有程序结束才会被释放
3 对象在内存中如何存储
Person *p1 = [Person new];
Person *p1
在栈内存中申请一块空间 声明了一个Person类型的指针变量p1
p1为指针变量。所以只存储地址
[Person new] 真正在内存中创建对象其实是这句
new 做的事情
a在堆内存中申请一块合适大小的空间
b在这个空间当中根据类的模版创建对象
类模版当中定义什么属性 就把这些属性依次声明在对象中
对象中还有另一个属性叫isa 是一个指针 指向对象所属的类在代码段中的地址
c初始化对象的属性
如果属性的类型是基本数据 那么值就是0
C语言的指针数据类型,那么赋值为NULL
OC的类指针类型,那么就赋值为nil
d返回对象的地址
3 注意
a对象里面只有属性 没有方法 自己类的属性外加isa指针指向代码段中的类
b 如何访问对象的属性
指针名->属性名;
根据指针。找到指针的对象。再找到对象中的属性来访问
c 如何调用方法
[指针名 方法名];
先根据指针名找到对象,对象发现要调用这个方法,再根据对象的isa来找的这个类
然后调用类里面的方法
4为什么不把方法存储在对象中
因为每个对象的代码都是一模一样的。没有必要每个对象都保存一个方法 这样的话空间太浪费了
既然都一样 那就保存一份就好了
5对象属性的默认值
创建一个对象属性 没有赋值,会有默认值
如果属性的类型是基本数据 那么值就是0
C语言的指针数据类型,那么赋值为NULL
OC的类指针类型,那么就赋值为nil
*/
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}