iOS APP 开发 OC 第七天, 对象在内存中的储存

tags: OC 30 day

1. 内存中的五大区域:

栈 储存局部变量。
堆 工程师手动申请的字节空间 malloc calloc realloc函数。
BSS段 储存未被初始化的全局变量,静态变量。
数据段(常量区) 储存已被初始化的全局,静态变量,常量数据。
代码段 储存代码。

2. 类加载

  1. 在创建对象时,肯定是要访问类的。
  2. 声明一个类的指针变量也会访问类。

当程序运行期间,当某个类第一次被访问到的时候,会将这个类储存到内存中的代码段区域。这个过程叫做类加载。
只有类在第一次被访问时,才会做类加载。
一但类被加载到代码段以後,直到程序结束的时候才会被释放掉。

3. 对象在内存当中究竟是如何储存的?

假设下面这段写在函数之中

Person *p1 = [Person new];
  1. Person *p1; 会在栈内存当中申请一块空间,在栈内存中声明一个Person类型的指针变量p1。p1是一个指针变量,那麽只能储存地址。
  2. [Person new]; 真正在内存中创建对象的是这段代码。
    new做的事情:
    a. 在堆内存中申请一块合适大小的空间。
    b. 在这个空间中根据类的模板创建对象。
    类模板中定义了什麽属性,就把这些属性一次声明在对象之中,对象中还有另外一个属性,就是isa是一个指针(指向代码段)。
    c. 初始化对象的属性
    如果属性的类型是基本数据类型,那麽就服值为0。
    如果属性的类型是C语言的指针类型,那麽就服值为NULL。
    如果属性的类型是OC的类指针类型,那麽就赋值为nil。
    d. 返回对象的地址

我们来验证看看

@interface Person : NSObject
{
    @public
    NSString *_name;
    int _age;
}
-(void)sayHi;
@end
@implementation Person
-(void)sayHi
{
    NSLog(@"大家好,我叫%@,我今年%d岁",_name,_age);
}
@end




int main(int argc, char * argv[]) {
    Person *p1 = [Person new];
    NSLog(@"p1 = %p",p1);
    return  0;
}

首先来执行这一段代码,

我们会发现 *p1 的确是一个地址
那麽 p1的对象还有一个isa指针。

下一个断点来看看

我们发现p1对象里面确实有一个isa的指针,但是我们无法对他进行访问。

补充

  1. 对象当中只有属性没有方法,自己的类的属性外加一个isa指针指向代码段中的类。
  2. 如何访问对象的属性:指针名->属性名; 根据指针,找到指针指向的对象,再找到对象中的属性来访问。
  3. 如何调用方法:[指针名 方法名]; 先根据指针名找到对象,对象发现要调用方法,再根据对象的isa指针找到类。然後调用类里的方法。
  4. 为什麽不把方法储存在对象之中?因为每一个对象的方法的代码实现都是一模一样的,没有必要为每一个对象都保存一个方法,这样太浪费空间了。


不同的对象,指向的是同一个记忆体
6. 对象的属性默认值:如果我们创建一个对象,没有为对象的属性复职,那麽这葛对象的属性是有值的。如果属性的类型是基本的数据类型,默认值是0,如果属性的类型是C语言的指针类型,那麽就服值为NULL。如果属性的类型是OC的类指针类型,那麽就赋值为nil。


<<:  iOS APP 开发 OC 第六天, 练习实作一个类

>>:  iOS APP 开发 OC 第七天, nil 跟 NULL 一样吗?

元件服务--Windows的系统零件管理师

今天我想介绍最後一个警告事件,顺便谈谈「元件服务」这回事,他是一个Windows系统管理工具,管理C...

【C language part 3】条件&回圈

条件判断 Decision Control Statement 为了应付程序可能遇到的各种状况,C ...

DAY 30『 从相簿选取照片( 有裁剪照片功能 ) 』ImagePicker - Part2

在 @IBAction 里 令 vc 为 UIImagePickerController let v...

Day27 Plugin 从零开始到上架 - iOS instagram APIs

Modules: struct UserInfoResponse: Decodable { var ...

Day [2] — this:作用域 — JS之浸猪笼系列

如果你不知道这个系列为什麽叫这种激烈的名字可以看这篇: Day [0] — JS之浸猪笼系列 如果你...