OBJ-C对象的存储细节学习笔记

本文探讨Objective-C对象的存储细节,包括对象在堆区的内存分配,实例变量、对象方法的位置,以及对象方法的调用机制。同时讲解了#pragma mark指令的使用,区分对象方法与普通函数的不同,并列举了编程中常见的错误及其避免方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

============================================================================
                                对象的存储细节
=============================================================================


1. 对象的存储细节


[Person new] 做了3件事情


1.申请内存空间
2.给实例变量初始化
3.返回空间的首地址




1.申请的空间在内存的哪个区?


  堆区。(程序动态分配的内存空间)
  
  内存分配的具体操作如下:


    一共有三个区,当运行到 Person *p = [Person new];这段代码时,首先会在“内存代码区”加载Person这个类,有且仅有一份。然后会在“内存堆区”申请一块内存空间,然后初始化实例变量。数值型初始化为0,OC字符串型则为NULL。另外,在堆区还有个叫_isa的指针,它存放的是类在代码区的首地址。然后再“内存栈区”会有一个空间分配给p,p存储的地址为类在堆区的首地址。


2.实例变量又保存在什么地方?
  
  堆区。


3.对象方法保存在什么地方?


  代码区。


4.为什么使用[p run];就可以调用方法了?如何调用?


  首先找指针p对应的堆区空间,然后找到_isa指针,在找到_isa指向的代码区的空间,然后到该空间中找方法。


5.一个类可以创建多个对象


====================================================================================


#pragma mark指令的使用


作用是,给代码进行分组。使用在代码块前,可以使代码的结构清晰。


用法:


1.给代码块前加分割线:#pragma mark -


2.#pragma mark 分组(标识)名称


====================================================================================


函数和对象方法的区别


对象方法:


1. 对象方法的实现只能卸载@implementation...@end中,对象方法的声明只能写在@interface...@end   的中间;
2. 对象方法都以 - 开头,类方法都以 + 开头;
3. 独享方法智能由对象来调用,类方法只能由类调用,不能当做函数一样调用;
4. 函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在      @interface...@end中会无法识别,函数的声明可以在main函数内部也可以在main函数外部。
5. 对象方法归类/对象所有。




函数: 


1.所有的函数都是平行的;
2.函数不存在隶属关系;
3.使用的时候可以直接调用;
4.不可以访问对象中的成员变量;
==================================================================================


常见错误:


1. 在声明时不能对类的成员变量进行初始化;
2. 成员变量和方法不能用static等关键字修饰,不要和c语言混淆;
3. 类的实现可以写在main函数之后,但前提是要有声明;
4. 方法的声明和实现必须同时有,不然调用不了!


====================================================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值