============================================================================
对象的存储细节
=============================================================================
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. 方法的声明和实现必须同时有,不然调用不了!
====================================================================================
对象的存储细节
=============================================================================
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. 方法的声明和实现必须同时有,不然调用不了!
====================================================================================